我剛纔讀這篇文章:The Truth About Garbage Collection爲什麼不能立即收集「隱形」物體?
在第「A.3.3隱形」闡述瞭如何當一個對象進入了invisible
狀態。
在下面的代碼,分配給變量foo
對象將離開try/catch
塊之後成爲invisible
並將remainly強烈引用直到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可以簡單地彈出所有四個元素並丟棄它們。
這是一個好主意,不要將不相關的代碼混合到同一個方法中。混淆的代碼也會混淆JVM。 –