2011-10-08 21 views
2

我還沒有使用PhantomReferences。似乎很少有真實世界使用的好例子。當PhantomReference/SoftReference/WeakReference排隊時,您如何知道它所指的是什麼?

當你的隊列中出現一個幻像時,你怎麼知道它是哪個對象? get()方法似乎沒用。據the JavaDoc

因爲虛引用的指示對象總是不可訪問, 此方法始終返回null。

我認爲,除非你的對象是單身,你總是想用幻影的,在你把你爲了瞭解死亡需要的任何紀念品。

這是正確的,還是我錯過了什麼?

對於SoftReferences,這也是如此嗎? 對於WeakReferences?

鏈接到相關的使用例子會很好。

+1

第一次也是最後一次我碰到幻影引用是在我的學位,這是我的主管的意見,他們很漂亮很無用。 – lynks

+0

我想知道他是否想過繼承這個參考。 –

+0

@lynks,他們不是無用的,你可以創建自己的終結者 - 與他們一樣。具有一些可運行的子類(impl。或refer)是一種常用的方法。或者,您可以使用身份映射幻影 - >運行。 'sun.misc.Clearner'是在java 1.4中引入的,有利於最終化,所有的DirectBuffers都使用它。 – bestsss

回答

1

我認爲,除非你的對象是單身,你總是想用幻影的子類,在你把你爲了瞭解死亡需要的任何紀念品。

您也可以使用Map<Reference<?>, SomeMetadataClassOrInterface>來恢復任何您需要的元數據。由於ReferenceQueue<T>會返回Reference<T>,因此您必須將其轉換爲您所期望的PhantomReference的任何子類,或者讓爲您完成。

對於它的價值,它看起來像使用PhantomReferences將給你帶來負擔:

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

所以你必須clear()你自己的參考爲了回收記憶。 (爲什麼有必要這樣做,而讓JVM爲你做這件事超出了我)

+1

謝謝,傑森。我能想到的唯一好方案就是某種JNI實現的異步數據源正在寫入引用的對象中,並且在內存被回收之前必須告訴它停止。在這種情況下,如果沒有像Phantom這樣的機制,簡單的忘記處理()錯誤可能導致內存損壞。表達它的另一種方式是,這是finalize()的更好選擇。合理? –

+0

ahhh ...從來沒有想到JNI封裝的代碼使用由JVM分配的內存的情況。除此之外,似乎沒有任何理由推遲特定內存塊的垃圾回收。 –

相關問題