[英]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字節)並且不再考慮對象。 最后我們處理數據而不是對象。 這使性能提高了很多倍,我們能夠處理比預期更多的數據。
在那之后我們注意到這一切都適合數據庫,這就是我們抓住一切的重點。
因此,請查看直接緩沖區可以為您做什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.