2010-09-27 61 views

回答

9

該對象不會被收集,直到它再次無法到達。

根據JavaDoc,不會再次調用finalize()。

3

是的,這就是爲什麼你不使用終結器(嗯,原因之一)。

有一個參考集合是做這個東西。我會查找它並在一秒內發佈,但我認爲它是PhantomReference。

沒錯,PhantomReference

幻影參考對象,其集電極之後排隊確定其指示可以以其它方式回收。幻影引用最常用於以比Java最終化機制更靈活的方式安排驗屍前清理操作。

+0

不,這是爲什麼不寫一個非常糟糕的finaliser(如果沒有足夠的其他原因)。 – 2010-09-29 00:14:40

7

如果仔細閱讀API說明,您會看到終結器可以使對象再次可達。該對象不會被丟棄,直到它不可用(再次),但finalize()將不會被調用多次。

+0

實際上,終結器*通過在發現對象無法訪問的時間與運行終結器的時間之間的根引用,可以強制實現對象的可達性。如果在那段時間被發現無法訪問的對象成爲對某個其他對象的唯一存活引用,那麼在終結器運行或該引用通過其他方式失效後,該另一個對象將不可收集。 – supercat 2013-02-26 01:07:41

10

然後該對象基本上不會被垃圾收集。這叫做對象復活。執行搜索該術語,你應該得到一堆有趣的文章。正如Jim所說,重要的一點是終結者只能運行一次。

3

它實際上做了另一次檢查並確保沒有更多的對象引用。由於它的第二遍測試會失敗,所以最終不會釋放對象的內存。

因爲對於任何給定的對象,finalize只被調用一次,所以下一次沒有引用時,它只會釋放內存而不調用finalize。最終確定一些好的信息here

相關問題