2015-07-12 35 views
0

我想了解下面的粗體語句。這是什麼意思? (Linkjava中phantomreference的重要性

它覆蓋finalize()現在必須被確定爲是在至少兩個分開的垃圾收集週期 垃圾以 被收集的對象。當第一個週期確定它是垃圾時, 有資格完成。由於在定稿過程中對象「復活」 的可能性(slim,但不幸實際),垃圾收集器必須在 對象實際被刪除之前再次運行。 因爲最終確定可能不是 已經及時發生,所以在對象正在等待 完成時可能發生了任意數量的垃圾回收循環。這可能意味着在實際清理垃圾對象時出現嚴重延遲,並且爲什麼您可以獲得OutOfMemoryError,即使當大部分堆都是垃圾時。

什麼幻影解決

隨着幻影,這種情況是不可能的 - 當一個幻影 入隊,也絕對沒有辦法讓一個指針到現在已經死對象(這是好,因爲它不再在記憶中)。 由於PhantomReference不能用於重新生成對象,因此可以在第一次垃圾回收循環中立即清除對象 ,在該循環中發現它是幻象可達的。

請幫助我理解這個問題&解決

感謝

+0

現在是這樣,謝謝 –

回答

1

流行的看法相反,當他們的關聯對象是垃圾回收不會被觸發finalize方法,而是當他們的關聯對象本來是垃圾收集,但是它們的非默認finalize方法的存在。對象實際上不能被垃圾收集,直到系統可以100%確定沒有提及存在,但是運行finalize方法的行爲創建了一個強有根的對所討論的對象的引用,它至少會存在直到該方法退出。如果在執行finalize期間對對象的引用存儲在別處,則該引用可能會無限期地繼續存在。因此,可以收集其方法即將被調用的對象以及這樣的對象具有直接或間接強參考的任何其他對象,直到方法已經運行並且下一個GC循環確認沒有對該對象已經存在了。

PhantomReference類用來封裝不同的範例:不是讓對象保持活動狀態,而是讓系統通知它已被放棄,並且它仍然活着的唯一原因是它可以接收放棄通知,因此需要清理的對象應該創建幫助對象來處理他們放棄的通知。如果輔助對象避免保留對它們不屬於「自己」的任何外部對象的引用,則它們的存在不會干涉父對象或父對象直接或間接引用的其他對象的集合。輔助對象通常不會擁有足夠的信息讓他們「做得太多」,但這很好,因爲他們不應該做太多事情。相反,他們的設計應該專注於執行如果他們的父母被放棄將需要清理。

+0

真棒。現在清楚了。謝謝 –