簡體   English   中英

如何針對長生命對象優化Java gc

[英]How to optimize Java gc for long living objects

我的Java應用程序維護一個內部緩存,可以增長到10演出。 到期策略設置為30分鍾或達到內存閾值時(我正在使用本地ehcache)。 很明顯,在30分鍾之后,所有緩存的對象都將在舊版本中,並且需要一個完整的gc來收集它們。 至於現在停止世界暫停可能達到6秒,我想減少它。

平均對象大小為500k,但最高可達1mcg,因此我們討論的是10000-20000個緩存對象(實際上是字節數組)。

GC優化的最佳策略是什么? 我知道我可以脫離堆,但它是最后的解決方案。

謝謝!

10GB緩存不是你應該在堆中做的事情。 使用ByteBuffers進行緩存。 對象創建不應該那么昂貴。 這種方式不涉及GC,您可以自己管理所有內容。

例如,如果在Java數據庫管理系統中實現頁面緩存,則不會為其創建對象,而是使用字節緩沖區或托管字節緩沖區或最佳直接字節緩沖區。 你可以在這里了解更多關於這三個。

如果您處理更多,那么讓我們一次說出一百萬個對象,您會看到GC時間份額上升。 我看到我們管理大量節點進行數據處理的情況,而且非常慢。 然后,我們切換到直接字節緩沖區方案,甚至使用了一些額外的技術,我們能夠容納更多的數據(對象至少每個成本為24字節)並且不再考慮對象。 最后我們處理數據而不是對象。 這使性能提高了很多倍,我們能夠處理比預期更多的數據。

在那之后我們注意到這一切都適合數據庫,這就是我們抓住一切的重點。

因此,請查看直接緩沖區可以為您做什么。

我經常使用緩存服務,在JVM堆中保存10-30 GiB的數據。 Concurent Mark Sweep(GC)算法可以很好地處理這些情況,保持最大停止世界暫停約100ms(但絕對數量取決於硬件)。

您可以在我的博客中找到用於緩存應用程序和堆大小調整的GC調整清單

在這里您可以找到有關Concurent Mark Sweep算法本身的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM