Что означает стек =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?