寫在前面:2020年面試必備的Java後端進階面試題總結了一份複習指南在Github上,內容詳細,圖文並茂,有需要學習的朋友可以Star一下!
GitHub地址:https://github.com/abel-max/Java-Study-Note/tree/master
JVM 配置常用參數
堆參數
回收器參數
如上表所示,目前主要有串行、並行和併發三種,對於大內存的應用而言,串行的性能太低,因此使用到的主要是並行和併發兩種。並行和併發 GC 的策略通過 UseParallelGC 和 UseConcMarkSweepGC 來指定,還有一些細節的配置參數用來配置策略的執行方式。例如:XX:ParallelGCThreads, XX:CMSInitiatingOccupancyFraction 等。 通常:Young 區對象回收只可選擇並行(耗時間),Old 區選擇併發(耗 CPU)。
項目中常用配置
常用組合
常用 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次。
歡迎關注微信公衆號【慕容千語】~