论坛首页 Java企业应用论坛

Java变量作用域内存

浏览 11707 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (15) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-05-11  
lbfhappy 写道
楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊


是jclasslib
0 请登录后投票
   发表时间: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而言,局部变量声明在循环体内、或者循环体外没有任何区别。
0 请登录后投票
   发表时间:2010-05-11  
字节码工具很nice  多谢sswh了
0 请登录后投票
   发表时间:2010-05-11  
引:Java是编译型语言不是解释型语言。

我晕,Java不是编译型语言是解释型语言。
0 请登录后投票
   发表时间:2010-05-11  
我认为编程工作和做事的方法是一样的,想了一个不算恰当的比方:
    会议室需要招开10次不同的会议,每次会议完后你需要清理会场
    以下设备其实是不用重复清理的:座子、椅子(没必要每次开完会后把座子椅子拿回去,然后又重新摆好)
   以下设备其实是需要每次清理的:一次性水杯(这些不能给其它到会人员重复使用吧)
0 请登录后投票
   发表时间:2010-05-12  
  在外面不要初始化(哪怕是null)
0 请登录后投票
   发表时间:2010-05-12  
flyfan 写道
lbfhappy 写道
楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊

强烈要求公布一下

0 请登录后投票
   发表时间: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
在运行时,声明根本不会执行
所以定义在循环外或内没有什么区别
不过,还是遵守最小作用域原则
0 请登录后投票
   发表时间:2010-05-13  
sswh 写道
lbfhappy 写道
楼上查看字节码的工具是什么啊.能介绍一下不?
看上去好像是netbeans的感觉啊


是jclasslib


我用jclasslib 写了一个 NetBeans 插件。http://www.iteye.com/topic/665511
0 请登录后投票
   发表时间: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开辟的内存。但是定义在里面的话内存在循环结束后就被回收了。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics