我一直在尝试了解以下 Java 代码的字节码是如何工作的。我找不到 stack=1 和 stack=4 部分含义的解释。
Java代码:
public class SimpleRecursion {
public int factorial(int n) {
if (n == 0) {
return 1;
}
return n*factorial(n - 1);
}
}
我编译了 SimpleRecursion.java 类,这是在 SimpleRecursion.class 上执行 javap 后得到的:
默认构造函数字节码:(stack=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
阶乘方法的字节码:(stack=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 */
stack=1 和 stack=4 是什么意思?
更新:似乎有一个类似的问题:
Java字节码中的`Stack=1,Locals=1,Args_size=1`是什么意思?
但它没有回答以下问题:
编译器如何知道阶乘方法的堆栈上最多有 4 个对象?它是否计算 iload/aload 指令的数量?