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

废话很少说,如下附代码:java

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

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虚拟机

....it

在网上看到这个别人提问题后,本身回想了下java的回收,将对象置于null,其实只是建议咱们的jvm虚拟机若是没有其余对象强引用它,它将会被jvm回收。class

这儿问题import

 o = null;

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

因此打印出来的值 对象的i值必定是存在的。

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

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

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

相关文章
相关标签/搜索