JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

若小寒發表於2019-03-22

JVM 配置常用引數

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

堆引數

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

回收器引數

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

如上表所示,目前主要有序列、並行和併發三種,對於大記憶體的應用而言,序列的效能太低,因此使用到的主要是並行和併發兩種。並行和併發 GC 的策略通過 UseParallelGC 和 UseConcMarkSweepGC 來指定,還有一些細節的配置引數用來配置策略的執行方式。例如:XX:ParallelGCThreads, XX:CMSInitiatingOccupancyFraction 等。 通常:Young 區物件回收只可選擇並行(耗時間),Old 區選擇併發(耗 CPU)。

專案中常用配置

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

常用組合

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

常用 GC 調優策略

JVM面試問題系列:JVM 配置常用引數和常用 GC 調優策略

GC 調優原則

在調優之前,我們需要記住下面的原則:

多數的 Java 應用不需要在伺服器上進行 GC 優化;

多數導致 GC 問題的 Java 應用,都不是因為我們引數設定錯誤,而是程式碼問題;

在應用上線之前,先考慮將機器的 JVM 引數設定到最優(最適合);

減少建立物件的數量;

減少使用全域性變數和大物件;

GC 優化是到最後不得已才採用的手段;

在實際使用中,分析 GC 情況優化程式碼比優化 GC 引數要多得多。

GC 調優目的

將轉移到老年代的物件數量降低到最小;

減少 GC 的執行時間。

策略 1:將新物件預留在新生代,由於 Full GC 的成本遠高於 Minor GC,因此儘可能將物件分配在新生代是明智的做法,實際專案中根據 GC 日誌分析新生代空間大小分配是否合理,適當通過“-Xmn”命令調節新生代大小,最大限度降低新物件直接進入老年代的情況。

策略 2:大物件進入老年代,雖然大部分情況下,將物件分配在新生代是合理的。但是對於大物件這種做法卻值得商榷,大物件如果首次在新生代分配可能會出現空間不足導致很多年齡不夠的小物件被分配的老年代,破壞新生代的物件結構,可能會出現頻繁的 full gc。因此,對於大物件,可以設定直接進入老年代(當然短命的大物件對於垃圾回收老說簡直就是噩夢)。-XX:PretenureSizeThreshold 可以設定直接進入老年代的物件大小。

策略 3:合理設定進入老年代物件的年齡,-XX:MaxTenuringThreshold 設定物件進入老年代的年齡大小,減少老年代的記憶體佔用,降低 full gc 發生的頻率。

策略 4:設定穩定的堆大小,堆大小設定有兩個引數:-Xms 初始化堆大小,-Xmx 最大堆大小。

策略5:注意: 如果滿足下面的指標,則一般不需要進行 GC 優化:

MinorGC 執行時間不到50ms;

Minor GC 執行不頻繁,約10秒一次;

Full GC 執行時間不到1s;

Full GC 執行頻率不算頻繁,不低於10分鐘1次。

JVM系列:

深入詳解JVM 記憶體區域及記憶體溢位分析

JVM的判斷物件是否已死和四種垃圾回收演算法

JVM 配置常用引數和常用 GC 調優策略

7種JVM垃圾收集器特點,優劣勢、及使用場景!

最後

後續會持續更新效能優化專題知識,寫的不好的地方也希望大牛能指點一下,大家覺得不錯可以點個贊在關注下,以後還會分享更多文章!


相關文章