2017-03-15 66 views
0

我想在我的庫中使用緩衝池並考慮使用SoftReference來實現對象的隱式返回和池大小平衡。ReferenceQueue適用於對象池嗎?

因此,通過 「合適的」 我的意思是:

  1. 他們是相當高性能的比較明確的ArrayBlockingQueue,它例如? (小於數量級)
  2. 它們在現代虛擬機(如Hotspot,Dalvik和ART)中的可靠性是否足以比WeakReference更「柔和」?

對我來說,這不是「不成熟的優化」,只是一種架構選擇,可以減少將對象返回池的麻煩,但如果不符合指定的要求,將會消除池的任何好處。

+0

你如何計劃在那裏使用軟引用?我認爲我們可以放心地說,這些構造並非設計時考慮到了任何形式 - 它們是一個定型構造,並且與任何類型的定型一樣,您不能期望它在任何合理的時間範圍內執行或就此而言,所發生的事情取決於大量的JVM和GC特定配置。 –

回答

0

沒有理由認爲SoftReferenceWeakReference不適用於任何Java(TM)平臺或Android平臺。有一個Android bug report討論了Java(tm)和Android行爲之間的區別:Android比Java(tm)更「熱切」地清除軟引用。然而,分析指出,差別是:

  • 通過設計,並且本說明書的「語義包絡」內
  • ;即Java(tm)javadocs。

但是,我不明白的是你如何建議使用Reference對象來實現返回對象(到池)。如果已分配緩衝區的代碼刪除其對對象的(強)引用,那麼弱引用或軟引用將在引用入隊前被清除。這意味着在緩衝池的ReferenceQueue得知它之前,緩衝區將被GC'd。另一方面,如果你只是使用弱/軟引用,以便池不是內存泄漏......沒關係。 SoftReference是正確的選擇。

SoftReference對顯式池大小無效。軟引用僅對內存壓力做出響應,而您對此無法控制。

最後,引用隊列和引用隊列產生可觀的GC開銷。雖然它們不間斷,但GC必須在遇到它們時標記它們。當GC打破它們時,在排隊它們和處理排隊參考文件時會產生可觀的開銷。

+0

我的意思是說SR對於隱式池大小的調整很有用 - 如果沒有足夠的內存 - 它們將被清除。 – Pavlus

+0

由於各種原因,僅依靠SR進行泳池大小調整可能會導致性能問題。明確的池大小會更好,可能還有SR。但是,管理費用很難衡量,因爲它們會顯示爲額外的GC超前。 –

+0

通過「返回池」我的意思是說,一旦沒有對象的強引用(它不再被第三方代碼使用),它將被GC排隊,並且由於SoftReference仍然可以,如果沒有收集到,我們可以使用隊列中的參考來重新獲取那些「故意丟失」的對象。如果沒有足夠的記憶和大量未使用的物體 - 它們將被收集。 – Pavlus