java 局部变量 内存_java – 在方法中未使用的局部变量是否在JVM中获取内存?

这是一个问题,值得研究javap。

public class Foo

{

public int bar(){

System.out.println("foo");

return 8;

}

public int foo(){

int x;

System.out.println("foo");

return 8;

}

}

请注意,foo()和bar()之间的区别是,一个声明一个局部变量x,另一个声明不是。

现在看看jvm代码(使用javap -v Foo在你的机器上看到这个)

public int bar();

descriptor: ()I

flags: ACC_PUBLIC

Code:

stack=2, locals=1, args_size=1

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String foo

5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: bipush 8

10: ireturn

LineNumberTable:

line 6: 0

line 7: 8

public int foo();

descriptor: ()I

flags: ACC_PUBLIC

Code:

stack=2, locals=2, args_size=1

0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;

3: ldc #3 // String foo

5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V

8: bipush 8

10: ireturn

LineNumberTable:

line 12: 0

line 13: 8

}

有趣的是,逐行输出是相同的,但是bar的局部变量是1,而foo是2.因此,看起来空间确实是为x分配的,即使编译器输出不使用它。

更新:做一些更多的研究,我发现this page这向我建议,虽然编译的字节码意味着空间分配给x,它可能确实被jvm优化。不幸的是,我没有找到对所执行的优化的完整描述。特别地,compiling的JVM文档章节没有提到从堆栈中删除未使用的变量。所以,除了进一步的发现,我的答案将是它的实现依赖,但它似乎像任何自尊的编译器将执行的优化。注意,这是一个局部变量而不是一个字段,这并不重要 – 事实上,局部变量是最有可能被优化掉的,因为它们是最容易分析和消除的。 (正是因为它们是本地的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值