2016-09-15 56 views
2

我有一個計算密集的一次性離線處理任務,需要幾個小時才能運行,並且我正在使用Caffeine作爲我的內存中緩存。設置最大緩存大小的最佳啓發式是什麼?我正在運行帶有8GB內存的Java程序,我願意給它緩存大約4GB的內存,但我不確定內存如何轉換爲我的緩存實際大小。我決定跟.softValues()去讓JVM決定,但我跑進咖啡因的JavaDoc下面的話:咖啡因:如何拿出適當的緩存大小

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

回答

2

軟引用在概念上具有吸引力,但通常會影響長時間運行的JVM的性能。這是因爲他們通過填補老一代而造成堆壓力,並且在完整的GC期間僅爲collected。這可能會導致GC抖動,每次釋放足夠的內存時,會迅速消耗,並需要另一個完整的GC。對於延遲敏感的應用程序,由於驅逐是全球性的,所以這會受到進一步的影響,因爲無法暗示哪些緩存是最關鍵的。

軟引用不應該是默認值,請轉到策略。這可能是一個合理的簡化吞吐量,非用戶面臨的任務。但是,當GC時間,延遲和可預測的性能很重要時,這可能是危險的。

不幸的是,上漿的最佳答案是猜測,測量和重複。導出統計信息,嘗試設置並進行適當調整。命中率曲線可以通過捕獲訪問跟蹤(密鑰哈希日誌)和不同大小的文件獲得。其有趣的數據,但通常是一些簡單的調整運行是足夠好的。

1

軟引用允許VM在內存不足時收回對象。這對緩存來說是一種不同的策略。你可以簡單地有一個WeakHashMap(有但是SoftReferenceWeakReference之間的差異)

一個大區別是,高速緩存通常讓你的驅逐對象的策略(LRU,FIFO等)作出決定,同時軟/弱引用贏得「T。

您應該能夠至少在量級上猜測對象的大小。是1k,1mb,10mb?

如果你真的不知道對象有多大,大多數緩存允許你添加一個偵聽器來驅逐並記錄它。這與查找緩存未命中的日誌相結合應該能讓你很好地瞭解緩存是如何執行的。