锁定老帖子 主题:Java变量作用域内存
精华帖 (0) :: 良好帖 (0) :: 新手帖 (15) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-05-11
lbfhappy 写道 楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊 是jclasslib |
|
返回顶楼 | |
发表时间:2010-05-11
最后修改:2010-05-11
另外,你的第二段代码如果去掉holdMemory初始化为null操作,
也就是下面两种情况: public void testname() throws Exception { HoldMemory holdMemory;//去掉=null操作 for (int i = 0; i < 50000; i++) { holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 和 public void testname() throws Exception { for (int i = 0; i < 50000; i++) { HoldMemory holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 所生成的字节码是完全相同的。(只是变量i和holdMemory在局部变量表的位置不同,对程序运行没有任何影响) 可见:对Java而言,局部变量声明在循环体内、或者循环体外没有任何区别。 |
|
返回顶楼 | |
发表时间:2010-05-11
字节码工具很nice 多谢sswh了
|
|
返回顶楼 | |
发表时间:2010-05-11
引:Java是编译型语言不是解释型语言。
我晕,Java不是编译型语言是解释型语言。 |
|
返回顶楼 | |
发表时间:2010-05-11
我认为编程工作和做事的方法是一样的,想了一个不算恰当的比方:
会议室需要招开10次不同的会议,每次会议完后你需要清理会场 以下设备其实是不用重复清理的:座子、椅子(没必要每次开完会后把座子椅子拿回去,然后又重新摆好) 以下设备其实是需要每次清理的:一次性水杯(这些不能给其它到会人员重复使用吧) |
|
返回顶楼 | |
发表时间:2010-05-12
在外面不要初始化(哪怕是null)
|
|
返回顶楼 | |
发表时间:2010-05-12
flyfan 写道 lbfhappy 写道 楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊 强烈要求公布一下 |
|
返回顶楼 | |
发表时间:2010-05-13
sswh 写道 另外,你的第二段代码如果去掉holdMemory初始化为null操作,
也就是下面两种情况: public void testname() throws Exception { HoldMemory holdMemory;//去掉=null操作 for (int i = 0; i < 50000; i++) { holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 和 public void testname() throws Exception { for (int i = 0; i < 50000; i++) { HoldMemory holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 所生成的字节码是完全相同的。(只是变量i和holdMemory在局部变量表的位置不同,对程序运行没有任何影响) 可见:对Java而言,局部变量声明在循环体内、或者循环体外没有任何区别。 同意sswh 在运行时,声明根本不会执行 所以定义在循环外或内没有什么区别 不过,还是遵守最小作用域原则 |
|
返回顶楼 | |
发表时间:2010-05-13
sswh 写道 lbfhappy 写道 楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊 是jclasslib 我用jclasslib 写了一个 NetBeans 插件。http://www.iteye.com/topic/665511 |
|
返回顶楼 | |
发表时间:2010-05-13
sswh 写道 另外,你的第二段代码如果去掉holdMemory初始化为null操作,
也就是下面两种情况: public void testname() throws Exception { HoldMemory holdMemory;//去掉=null操作 for (int i = 0; i < 50000; i++) { holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 和 public void testname() throws Exception { for (int i = 0; i < 50000; i++) { HoldMemory holdMemory = new HoldMemory(); } System.out.println(Runtime.getRuntime().freeMemory()); } 所生成的字节码是完全相同的。(只是变量i和holdMemory在局部变量表的位置不同,对程序运行没有任何影响) 可见:对Java而言,局部变量声明在循环体内、或者循环体外没有任何区别。 所谓字节码完全相同而位置不一定,就说程序是一致的,我看很大程度上是不对的。 就是因为变量i和holdMemory在局部变量表的位置不同,所以程序在运行时的内存状态是不一致的。 当holdMemory定义在外面的话,循环结束后内存中依然保留为holdMemory开辟的内存。但是定义在里面的话内存在循环结束后就被回收了。 |
|
返回顶楼 | |