Что означает стек =1 (или любое целочисленное значение) в байт-коде Java

Я пытался понять, как работает байт-код следующего кода Java. Я не мог найти объяснение того, что означает часть стека =1 и стека =4.

Java-код:

public class SimpleRecursion {

    public int factorial(int n) {
        if (n == 0) {
            return 1;
        }
        return n*factorial(n - 1);
    }

}

Я скомпилировал класс SimpleRecursion.java, и это то, что я получаю после выполнения javap на SimpleRecursion.class:

Байт-код конструктора по умолчанию: (стек =1 присутствует в 5-й строке)

public SimpleRecursion();
descriptor: ()V
flags: ACC_PUBLIC
Code:
  stack=1, locals=1, args_size=1
     0: aload_0
     1: invokespecial #1                  // Method java/lang/Object."<init>":()V
     4: return
  LineNumberTable:
    line 1: 0

Байт-код метода факториала: (стек =4 присутствует в 5-й строке)

public int factorial(int);
descriptor: (I)I
flags: ACC_PUBLIC
Code:
  stack=4, locals=2, args_size=2
     0: iload_1
     1: ifne          6
     4: iconst_1
     5: ireturn
     6: iload_1
     7: aload_0
     8: iload_1
     9: iconst_1
    10: isub
    11: invokevirtual #2                  // Method factorial:(I)I
    14: imul
    15: ireturn
  LineNumberTable:
    line 4: 0
    line 5: 4
    line 7: 6
  StackMapTable: number_of_entries = 1
    frame_type = 6 /* same */

Что означает стек =1 и стек =4?

Обновление: Похоже, что есть похожий вопрос:

Что означает `Stack=1, Locals=1, Args_size=1` в байт-коде Java?

Но это не отвечает на следующие вопросы:

Откуда компилятор знает, что в методе факториала будет не более 4 объектов в стеке? Считается ли количество команд iload/aload?

0 ответов

Другие вопросы по тегам