我最近接受了任務,在我們的Java服務器中進行基準測試和優化內存利用率,同時修復了內存泄漏(如果有的話)。我們有4臺JVM服務器運行在一臺擁有15G物理內存和32G交換內存的計算機上。以下是free -m
快照。瞭解JVM內存優化
total used free shared buff/cache available
Mem: 15289 14786 392 1 110 342
Swap: 32767 3776 28991
如果我理解正確: -
- 大部分的物理內存在使用中,最交換存儲器是免費的。
- 實際上緩衝了很少量的內存。
- 我有48GB的虛擬內存
現在我的每個服務器是與-Xmx
選項設置7G
最大堆大小運行。以下是來自GC utils的
$ jstat -gcutil 8317
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 6.97 0.22 96.77 91.89 72 8.027 33 10.975 19.002
$ jstat -gcutil 8332
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 5.17 50.76 96.57 91.65 274 51.001 51 179.106 230.107
$ jstat -gcutil 8249
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 2.10 80.37 69.53 96.87 92.08 421 69.478 13 56.569 126.047
$ jstat -gcutil 23875
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
27.91 0.00 37.07 86.29 97.59 94.60 232 7.294 2 0.030 7.324
輸出運行手冊全部GC後,它徹底解放年輕人和老一代的所有服務器。現在我需要幫助理解這個特點,基本上我是否正確地假設了以下內容?
- 對象移動取決於壽命和生存算作伊甸園 - > S0 - > S1 - > O.
- 三個服務器中有老根>楊將軍這是否意味着,全GC沒有運行足夠?
- 或者,我需要調整SurvivorRatio和NewRatio等設置,讓年輕一代有更多收集對象的機會,並延遲將對象移動到舊空間。
- 但是,增加Y空間意味着較慢的GC和較差的應用程序吞吐量,我應該增加內存並停止擔心調整嗎?
我在問這個問題,因爲Full GC會釋放所有內存,所以沒有內存泄漏,但是如何通過調整GC設置來平衡內存使用量和應用程序吞吐量。任何人都可以通過考慮上述機器狀態來提供更多方向或建議?
JVM Details:
Java Version: openjdk version "1.8.0_131" Server Class
GC: Parallel Collector(Default one)
感謝您的回答。然而,事情仍然清楚。整個焦點都是服務器都不需要7g的情況,只是YG沒有足夠的機會收集對象,並且OG運行頻率較低,因爲它通常是件好事。增加Y空間可能會解決這個問題。但它可能會增加YGCT。然而,我不清楚,YG的增加是如何導致OOM的?堆大小仍然保持不變。 –
一旦有少量收集品存在,即將被撤離到終身位置,並且終身沒有足夠的空間來容納他們,就會發生OOM。基本上,對於OOM來說,年輕人是完全不相關的。較大的年輕空間會使次要收集次數減少(整個過程效率更高),但較大的年輕手段(相對)較小,可能會觸發OOM。 – Jonathan
@MangatRaiModi我還沒有明白這一點:你認爲爲什麼gcs應該更頻繁地運行?通常在這方面進行優化時,您希望儘可能地減少採集頻率 - 這對於年輕人和老年人都是如此。 – Jonathan