我知道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");
}
}
答案 0 :(得分:9)
在您调用System.gc()
时,您创建的SomeClass
实例 符合垃圾回收条件,因为list
对象仍然引用它,即它仍然可以到达。
但是,只要此方法返回list
超出范围,那么obj
将有资格进行垃圾回收(list
}。
简单地将引用obj
设置为null本身不会使引用的对象符合垃圾回收的条件。只有在可见对象图表中有否引用该对象时,该对象才有资格。
答案 1 :(得分:4)
对象obj是否有资格进行垃圾收集?
只有这些对象是垃圾收集的,甚至没有一个引用来访问它们。 (循环连接除外)
在您的代码中,有两个引用指向new SomeClass();
你放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)
同意,只要它在列表中,它就不会被垃圾收集。