【发布时间】:2021-06-13 10:42:04
【问题描述】:
首先让我说我知道 System.gc() 更多的是收集垃圾而不是命令的建议,并且不能保证收集完成、启动或收集特定对象。然而……
使用下面的代码,只有当我在引用中明确放置 null 时才会收集 a1 实例。如果 a1 超出范围,则不会被收集。
class A {
@Override
protected void finalize() throws Throwable {
System.out.println("Collecting A");
}
}
public class Example {
public static void main(String[] args) throws InterruptedException {
try {
A a1 = new A();
//a1 = null; // a1 gets collected only if I uncomment this line
}
finally {
System.out.println("Finally executed");
}
System.gc();
Thread.sleep(1000);
}
}
如果 a1 超出范围,并且没有强引用,为什么不收集它?是不是因为这个作用域不构成单独的栈帧?
【问题讨论】: