Java方法可以有超过255个局部变量吗?

时间:2012-12-24 22:10:36

标签: java jvm bytecode low-level opcode

iload Java操作码用于将值从局部变量数组(LVA)推送到操作数堆栈。

此操作码将单个字节作为参数(en.wikipedia.org/wiki/Java_bytecode_instruction_listings),用作LVA的索引。

如果LVA的一个元素始终是对象的引用(我猜这不是静态方法的情况,但是现在让我们忽略它们),并且如果只使用一个字节作为索引(256个可能)值),那么一个方法如何访问超过255个不同的局部变量?

2 个答案:

答案 0 :(得分:16)

是的,Java方法可能有超过255个局部变量。 wide操作码指令可用于修改iloadaload指令以使用16位索引而不是8位索引,这意味着您最多可以有65536个不同的索引函数中的局部变量,只要wide操作码最终被使用。

那就是说,请注意Java局部变量不一定与JVM局部变量一一对应。 Java编译器可能会查看您的代码,注意本地的空间可以在某些上下文中重用,然后将多个Java本地映射到相同的JVM局部变量。

希望这有帮助!

答案 1 :(得分:11)

我通过编写300个本地变量的程序为您尝试了。这个片段:

System.out.println(a255);
System.out.println(a256);

编译成:

3575: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
3578: iload         255
3580: invokevirtual #53                 // Method java/io/PrintStream.println:(I)V
3583: getstatic     #16                 // Field java/lang/System.out:Ljava/io/PrintStream;
3586: iload_w       #256                // Utf8 a196
3590: invokevirtual #53                 // Method java/io/PrintStream.println:(I)V

注意:使用Eclipse和javac编译,结果完全相同。