2009-08-04 40 views
5

我只是挖公地IO庫周圍的垃圾收集和發現這一點:等待特定對象

 
Keeps track of files awaiting deletion, and deletes them when 
an associated marker object is reclaimed by the garbage collector. 

這可以爲FileCleaningTracker對象的文檔中找到。

現在我只是好奇我怎麼能自己做到這一點?我的代碼如何檢測垃圾收集器回收對象的時間?

回答

9

根據the source code,它使用PhantomReference類。根據文檔:

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

如果垃圾收集器在某個時間點確定虛擬引用的引用是虛幻可訪問的,那麼在那個時候或稍後它會將引用排入隊列。

爲了確保可回收對象保持如此狀態,可能不會檢索到幻像引用的指示對象:幻像引用的get方法始終返回null。

與軟引用和弱引用不同,幻數引用不會在垃圾收集器入隊時自動清除。通過幻影引用可訪問的對象將保持如此狀態,直到清除所有這些引用或者自己無法訪問。

PhantomReference構造函數接受兩個參數:

referent - 對象的新的虛引用將是指

q - 與該參考將被登記,或爲空如果隊列不需要註冊

q參數是一個inst類ReferenceQueue類。當referent變成虛擬可達時,PhantomReference將被添加到此ReferenceQueue。發生這種情況時,可以使用ReferenceQueue類的poll()remove()方法檢索PhantomReference

例如:

T objectToWatch = ...; 
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>(); 
new PhantomReference<T>(objectToWatch, referenceQueue); 

// Later on, probably in another thread... 
Reference<? extends T> nextReference = referenceQueue.remove(); 
// Tidy up! 

注:PhantomReference有一個名爲SoftReferenceWeakReference同級類,也可能是使用的。這些關係記錄在java.lang.ref package documentation中。

1

不確定這是否真的回答你的問題,但是在回收資源之前調用對象的finalize()方法。

編輯:這意味着你可以發送消息到另一個對象來提醒它,或沿着這些線。

+4

不要爲此目的使用終結器,或者如果可以避免使用終結器。無法保證在垃圾收集之後立即調用finalize()方法,甚至不會保證它將被調用(請參閱Effective Java 2nd Ed,第7項)。 java.lang.ref包是要走的路。 – Leigh 2009-08-04 15:03:13