[英]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();
你把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.