2011-07-06 25 views
6

每對番石榴的MapMaker.softValues()文檔:使用軟引用的「實際後果」是什麼?

警告:在大多數情況下,最好是設置每個高速緩存的最大尺寸,而不是使用軟引用的。如果您熟悉軟引用的實際後果,則只應使用此方法。

我對軟引用有一箇中間的理解 - 他們的行爲,用途和他們與垃圾收集的契約。不過,我想知道這些文件暗示的實際後果是什麼。爲什麼使用最大尺寸而不是軟引用更好?在實現緩存方面,軟引用的算法和行爲是否使得它們的使用效率更高,即硬編碼上限?

回答

4

我認爲他們所指的也是,如果你使用軟參考地圖,你應該做好最大的內存使用和潛在的更多的gc活動,因爲只有當需要釋放內存時引用gc'd向上。

如果您知道您只需要緩存中的最後n個值,那麼使用LRU緩存是一種更爲精簡的方法,對於正在運行的應用程序而言,資源使用率更具可預測性。

此外,根據this,在-server和-client JVM之間的行爲似乎有細微差別。

Sun JRE確實對待SoftReferences 與WeakReferences不同。如果 在可用的 內存上沒有壓力,我們 嘗試保留由SoftReference引用的對象 。一個細節:該策略的 「-client」和「-server」的JRE是 不同:-client JRE試圖 保持你的足跡小的 寧願以清除SoftReferences 而不是擴展堆,而 的 - 服務器JRE通過首選 擴展堆(如果可能)而不是清除SoftReferences來保持 的性能。一種尺寸 不適合所有。

+0

謝謝,我現在可以更清楚地看到LRU的優點。採取這種方式,是否有任何方法可以保證沒有強力到達的物體被驅逐(使用MapMaker)? –

4

使用SoftReferences的一個實際問題是它們傾向於一次性丟棄。你有一個緩存的原因是在大多數情況下提供很好的性能。

但是,將SoftReferences用於緩存可能意味着,在GC停止應用程序後,它將緩慢運行,直到重建緩存。即在您需要應用程序追上的時候。

注意:您可以使用LinkedHashMap as an LRU cache,它不必很複雜。

+1

+1我沒有意識到他們通常都被立即拋棄。感謝您的幫助 –

+1

WeakReference可以在GC上丟棄,SoftReference會根據GC的判斷被丟棄。但是,如果必須去,他們將很有可能被收回。即它不是一個優雅的降級。 –

相關問題