繁体   English   中英

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

[英]Is object eligible for garbage collection after “obj = null”?

我知道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");
    }
}

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

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

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

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

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

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

  1. OBJ
  2. 第0个列表索引

你把obj = null ,即它不再指向那个对象了。 但是,列表中仍然存在另一个可用于访问该对象的引用。

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

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

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

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

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

编辑:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM