对象是否符合"obj = null"之后的垃圾回收?

Man*_*ish 3 java garbage-collection

我知道System.gc()不能保证导致GC,但理论上,在下面的代码中,该对象是否obj有资格进行垃圾收集?

public class Demo {

    public static void main(String[] args) throws Exception {
        SomeClass obj = new SomeClass();
        ArrayList list = new ArrayList();
        list.add(obj);
        obj = null;
        System.gc();
    }

}

class SomeClass {
    protected void finalize() {
        System.out.println("Called");
    }
}
Run Code Online (Sandbox Code Playgroud)

Cam*_*ner 9

在您调用实例时,您创建System.gc()SomeClass实例符合垃圾回收的条件,因为它仍然被list对象引用,即它仍然可以访问.

但是,只要此方法返回list超出范围,那么obj将符合垃圾收集的条件(如此list).

简单地将引用设置obj为null本身不会使引用的对象符合垃圾回收的条件.只有在可见对象的图形中没有对象的引用时,对象才有资格.

  • 不,Java使用引用,而不是指针.将项目添加到列表时,它会获取引用的副本并存储该项目.更改原始引用不会更改复制的引用,因此仍可以访问`SomeClass`实例. (5认同)