簡體   English   中英

JVM 老一代不斷增加,而伊甸園和幸存者不變

[英]JVM old geneation keeps increasing while eden and survior are constant

我有一個 java spring 啟動應用程序,它應該是長時間運行並且需要響應時間也小於 50 毫秒。 通常我們能夠提供這個服務,但是當老一代接近被填滿時,CMS 啟動並且我們的響應時間 SLA 違反。 有什么策略可以用來確保完全 GC 永遠不會啟動。

我的服務器是 IO 密集型服務器,我們不在內存中存儲任何內容,但是有很多並發的 IOs(30k rpm),每個 IOs 響應攜帶大約 3-4MB 的數據。 從日志中我觀察到,Minor GC 在一秒鍾內運行了近 3-4 次,由於 eden 和 Survivor 空間較小(Eden 空間為 600MB,survivor 空間為 75MB),Minor GC 被非常頻繁地觸發。 由於非常頻繁的 GC,對象可能會在閾值次要 GC(15) 中幸存下來,並被提升為老一代。 所以我通過制作-XX:NewRatio=1增加了我的年輕一代空間。

問題仍然存在我可以在一秒鍾內看到分配失敗日志(如下)3-4次

[GC (Allocation Failure) 56455.997: [ParNew: 10705358K->222390K(11796480K), 0.0467254 secs] 13148872K->2667031K(24903680K), 0.0468292 secs] [Times: user=0.34 sys=0.00, real=0.05 secs]

使用新的遺物我監測了memory,年輕一代保持不變,而老一代不斷增加,下面是快照。

在此處輸入圖像描述

我認為對於我的應用程序來說,一個好的堆分配策略是年輕一代被不斷填充和清空,而老一代幾乎沒有使用,因為我們幾乎沒有任何長壽命的對象。 請建議如何實現上述目標,或您可能想到的任何更好的策略

以下是建議:

  1. 大型對象(例如 arrays 等)創建了舊代空間。 因此,請檢查您正在創建的大型對象以及它們會保留多長時間。

  2. 當滿足 object 的永久閾值時,對象將移至舊 GC。 因此,您可以朝這個方向看。

  3. 檢查您的次要和主要 GC 是如何執行的,就好像它們正在快速填充或滿足將對象移至舊代時的閾值。

  4. 查看您的伊甸園和幸存者的大小,如果它們太小,可能會觸發主要 gc 並導致 object 移動到老一代。

暫無
暫無

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

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