请教高手,下面这段?处的代码需要吗,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;
}

解决方案 »

  1.   

    其实bean=null这样的写法没用的
    因为容器存放的是bean的引用,bean=null不会影响容器中存储的内容,相当于bean原先的内存并没有改变,这句话就变得多此一举了
      

  2.   

    Vector v = new Vector(10);    
    for (int i = 1; i < 100; i++)    
    {    
     Object o = new Object();    
     v.add(o);    
     o = null;//这里需要释放吗,为什么呢。
    }
      

  3.   

    这种情况一般不需要释放,就算你显式释放也是不起作用的,这因为由JAVA的JVM回收机制决定
      

  4.   

    不需要释放
    加入把o=null替换成o=new Object();//Object其实是不能实例化的,大家理解就好
    那么就有两块内存空间,一块是这句之前的,这块内存的引用已经被存入v,还有一块是最新的,o就是这块新内存的引用,所以此时的o已经不能对v中的内容产生影响,换回来o=null也可以同样理解,这个“释放”就显得多余另外,假设真的释放了,那么存入v的内容也就失效了
      

  5.   

    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还没做过任何事呢。
      

  6.   

    看了上面的描述,就更糊涂了,请看下面的帖子,难道他在忽悠大家?
    http://glacier3.javaeye.com/blog/74602
      

  7.   

    http://www.javaok.net:8080/frontNewsAction.do?param=news&newsid=179
    看看这个 “编写对GC友好,又不泄漏的代码”
      

  8.   

    我看了那个帖子,里面不是就有那段代码吗。他的意思我想是这样的:
    用那段代码o=null并不能将循环中创建的对象释放掉。
    这应该也算内存泄漏的情况之一吧。因为即使某时刻GC运行了,也不能帮你回收这段内存。这么理解的话,应该没问题。
      

  9.   

    交给jvm处理吧
    即使你写了=null,通知它可以回收了,你也不能确定是不是就一定马上会被回收。