我只是挖公地IO庫周圍的垃圾收集和發現這一點:等待特定對象
Keeps track of files awaiting deletion, and deletes them when an associated marker object is reclaimed by the garbage collector.
這可以爲FileCleaningTracker
對象的文檔中找到。
現在我只是好奇我怎麼能自己做到這一點?我的代碼如何檢測垃圾收集器回收對象的時間?
我只是挖公地IO庫周圍的垃圾收集和發現這一點:等待特定對象
Keeps track of files awaiting deletion, and deletes them when an associated marker object is reclaimed by the garbage collector.
這可以爲FileCleaningTracker
對象的文檔中找到。
現在我只是好奇我怎麼能自己做到這一點?我的代碼如何檢測垃圾收集器回收對象的時間?
根據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
有一個名爲SoftReference
和WeakReference
同級類,也可能是使用的。這些關係記錄在java.lang.ref package documentation中。
不確定這是否真的回答你的問題,但是在回收資源之前調用對象的finalize()方法。
編輯:這意味着你可以發送消息到另一個對象來提醒它,或沿着這些線。
不要爲此目的使用終結器,或者如果可以避免使用終結器。無法保證在垃圾收集之後立即調用finalize()方法,甚至不會保證它將被調用(請參閱Effective Java 2nd Ed,第7項)。 java.lang.ref包是要走的路。 – Leigh 2009-08-04 15:03:13