1

我一直在尝试了解以下 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 指令的数量?

4

0 回答 0