我一直试图了解以下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之后得到的:
默认构造函数字节码:(第5行中存在stack = 1)
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
阶乘方法的字节码:(第5行中有stack = 4)
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是什么意思?
更新: 看来还有一个类似的问题:
What does the `Stack=1, Locals=1, Args_size=1` Mean in Java Bytecode?
但是它不能回答以下问题:
编译器如何知道阶乘方法的堆栈上最多有4个对象?它会计算iload / aload指令的数量吗?