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

时间:2013-03-19 06:13:16

标签: 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");
    }
}

5 个答案:

答案 0 :(得分:9)

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

但是,只要此方法返回list超出范围,那么obj将有资格进行垃圾回收(list}。

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

答案 1 :(得分:4)

  

对象obj是否有资格进行垃圾收集?

只有这些对象是垃圾收集的,甚至没有一个引用来访问它们。 (循环连接除外)

在您的代码中,有两个引用指向new SomeClass();

  1. OBJ
  2. 第0个列表索引
  3. 你放obj = null,即它不再指向那个对象了。但是,列表中仍然存在另一个可用于访问该对象的引用。

    因此,只有main返回时,该对象才有资格使用GC。即使它被调用,你也看不到finalize方法的输出。 (不确定JVM是否还在调用它)

答案 2 :(得分:3)

不,因为该对象实际存在于列表中。

答案 3 :(得分:1)

你作为Java程序员不能强制Java中的垃圾收集;它只会在JVM认为需要基于Java堆大小的垃圾收集时触发

当Java程序启动时,Java虚拟机从操作系统获取一些内存。 Java虚拟机或JVM使用此内存满足其所有需求,此内存的一部分是调用Java堆内存。

Java中的堆通常位于地址空间的底部并向上移动。每当我们使用new运算符或任何其他方法创建对象时,对象都是从Heap分配内存,当对象死亡或垃圾收集时,内存返回到Java中的堆空间

编辑:

  

对象obj是否有资格进行垃圾收集?

不,因为该对象仍在ArrayList中。

答案 4 :(得分:-2)

同意,只要它在列表中,它就不会被垃圾收集。