我對我的應用程序使用Guava緩存,並且想知道如果未設置maximumSize,默認行爲將會是什麼。我瞭解在設置maximumSize時的行爲,如https://github.com/google/guava/wiki/CachesExplained#size-based-eviction中所述。番石榴最大緩存大小
但是,如果未設置maximumSize並且JVM用完堆空間,會發生什麼情況?我假設垃圾收集器將運行並釋放空間,這意味着條目將從緩存中刪除?
我對我的應用程序使用Guava緩存,並且想知道如果未設置maximumSize,默認行爲將會是什麼。我瞭解在設置maximumSize時的行爲,如https://github.com/google/guava/wiki/CachesExplained#size-based-eviction中所述。番石榴最大緩存大小
但是,如果未設置maximumSize並且JVM用完堆空間,會發生什麼情況?我假設垃圾收集器將運行並釋放空間,這意味着條目將從緩存中刪除?
掩護下一個Cache
只是一個看中Map
,所以它有類似的空間限制。像Map
它不能包含多於Integer.MAX_VALUE
條目(因爲這是size()
的返回類型),所以您的理論上限緩存大小爲20億個元素。您可能還對番石榴的awesome element-cost analysis感興趣,它詳細說明了不同數據結構使用的確切字節數。
當然在實踐中真正關心的不是高速緩存中元素的數量(其大小),而是緩存對象所消耗的內存量。這與緩存的大小無關 - 單個緩存的對象可能足夠大而佔用了所有的堆。
默認情況下Cache
在這種情況下不會做任何特殊的事情,並且JVM崩潰。大部分時間這就是你想要的 - 從緩存中靜默刪除元素可能會破壞你的程序的假設。
如果您確實想在內存不足的情況下刪除條目,您可以使用use soft references和CacheBuilder.softValues()
。當JVM有可能耗盡可用堆空間時,它將嘗試垃圾收集軟引用。我鼓勵你只使用這個選項作爲最後的手段 - JVM必須做額外的工作來處理軟引用,並且需要使用它們通常意味着你可能以其他方式做別的事情。
任何人有任何想法呢? – user320550