我刚刚读了这篇文章:关于垃圾收集的真相
在“A.3.3 不可见”部分中,解释了对象如何以及何时进入invisible
状态。
在下面的代码中,分配给变量的对象foo
将invisible
在离开try/catch
块后变为并且将保持强引用,直到run
方法退出(这永远不会发生,因为while
循环永远运行)。
public void run() {
try {
Object foo = new Object();
foo.doSomething();
} catch (Exception e) {
// whatever
}
while (true) { // do stuff } // loop forever
}
这篇文章中说:
但是,JVM 的有效实现不太可能在超出范围时将引用归零。
为什么没有效率?
我的解释尝试如下:
假设此方法的堆栈包含四个元素,现在不可见的对象位于底部。
如果要立即收集对象,则必须弹出并存储三个元素,弹出并丢弃第四个元素,然后将三个仍然有效的元素推回堆栈。
如果在控制流离开run
方法后收集不可见对象,VM 可以简单地弹出所有四个元素并丢弃它们。