日期:2014-05-20  浏览次数:20618 次

请教高手,list循环加载后,循环体内变量需要释放吗?
请教高手,下面这段?处的代码需要吗,for循环内定义的变量不能自动释放吗?
public   DataModel   getList()   throws   ErrorException{
if(ps==null)   InitPage();
List   table=ps.getPage();
int   begin=ps.getStartIndex()+1;//开始行次
List   tmp=new   ArrayList();
for(int   i=0;i <table.size();i++){
QyJlqy   source=(QyJlqy)   table.get(i);
QyJlqyBean   bean=   new   QyJlqyBean();
bean.setQyJlqy(source);
bean.setRow(i+begin);
tmp.add(bean);
bean=null;//?????这里需要释放吗
}
list.setWrappedData(tmp);
tmp=null;//?????这里需要释放吗
return   list;
}


------解决方案--------------------
不需要,出了作用域就由虚拟机自动处理了
------解决方案--------------------
其实bean=null这样的写法没用的
因为容器存放的是bean的引用,bean=null不会影响容器中存储的内容,相当于bean原先的内存并没有改变,这句话就变得多此一举了
------解决方案--------------------
这种情况一般不需要释放,就算你显式释放也是不起作用的,这因为由JAVA的JVM回收机制决定
------解决方案--------------------
不需要释放
加入把o=null替换成o=new Object();//Object其实是不能实例化的,大家理解就好
那么就有两块内存空间,一块是这句之前的,这块内存的引用已经被存入v,还有一块是最新的,o就是这块新内存的引用,所以此时的o已经不能对v中的内容产生影响,换回来o=null也可以同样理解,这个“释放”就显得多余

另外,假设真的释放了,那么存入v的内容也就失效了
------解决方案--------------------
o=null不能释放任何东西。可以这么想:
o只是个变量,它占一小块内存,比如说4Byte,那么经过o=new Object()后,首先VM在内存堆里创建一个新的Object类型的对象,然后把这个对象的地址(应该是存储对象的内存块的首地址)填到4Byte中,这时o=new Object()就执行完了。o保存了一个对象的地址,那么通过o就可以找到那个对象。v.add(o)时,就是把4Byte里面保存的地址拷贝一份到Vector里面去,这样,以后你遍历Vector时,就能找到这个对象的地址,也就可以访问它了。经过v.add(o)之后,有两个地方都保存了刚才创建的对象的地址了,一个在v中,一个在o中。最后,o=null不会释放任何东西,只不过把4Byte里面都写上0而已。
多说一句,如果没有v.add(o),那么o=null就会导致真正有些东西被释放。因为循环中被new出来的那个对象,已经没有任何地方保存了对它的引用(也就是没有任何地方保存了它的地址),某段时间后,GC会把它清除掉。不过,谁又能说得准呢,也许在你的程序结束之前GC还没做过任何事呢。
------解决方案--------------------
http://www.javaok.net:8080/frontNewsAction.do?param=news&newsid=179
看看这个 “编写对GC友好,又不泄漏的代码”
------解决方案--------------------
我看了那个帖子,里面不是就有那段代码吗。他的意思我想是这样的:
用那段代码o=null并不能将循环中创建的对象释放掉。
这应该也算内存泄漏的情况之一吧。因为即使某时刻GC运行了,也不能帮你回收这段内存。这么理解的话,应该没问题。
------解决方案--------------------
交给jvm处理吧
即使你写了=null,通知它可以回收了,你也不能确定是不是就一定马上会被回收。