网上遇到一个关于java回收问题的思路

废话不多说,以下附代码:

import java.util.Iterator;
import java.util.Vector;

public class Test {
    int i;

    public static void main(String[] args) {
        Vector v = new Vector(10);
        for (int i = 1; i < 100; i++) {
            Test o = new Test();
            o.i = 11;
            v.add(o);//
            o.i = 10;
            o = null;
            //只是将对象指针设置为null,因为vector集合强引用了但是o指向的内存没有被回收,其实相当于new的o对象一直保持着集合里面有个指针指向了这个对象的内存空间
            if(o!=null){
                System.out.println("o.i=="+o.i);
            }
        }
        Iterator<Object> i = v.iterator();
        while (i.hasNext()) {
            System.out.println(String.valueOf(((Test) i.next()).i));
        }
    }
}

这儿打印的值:

10

10

....

在网上看到这个别人提问题后,自己回想了下java的回收,将对象置于null,其实只是建议我们的jvm虚拟机如果没有其他对象强引用它,它将会被jvm回收。

这儿问题

 o = null;

但是o给装在了集合,其实集合里面也会有有一个对应地址,或者说指针,可能说的不太严格,指向了这个内存,所以这时候jvm是不会回收对象o,只是o这个存在栈里面的变量可能会很快被回收。

所以打印出来的值 对象的i值一定是存在的。

从另外个角度说,集合的生命周期比装在集合里面的对象obj生命周期长,只有集合被置为null,被回收后,里面的对象才会真正被回收。

很小的问题,不过对于我们理解java的强应用和回收问题是有收获的。

有什么说的不对的问题,还请各位看官多多提问。

猜你喜欢

转载自my.oschina.net/u/3318187/blog/1646652