JVM面试问题系列:JVM 配置常用参数和常用 GC 调优策略
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次。
作者:java架構交流
鏈接:https://juejin.im/post/5c94a123f265da610916081f
總結
以上是生活随笔為你收集整理的JVM面试问题系列:JVM 配置常用参数和常用 GC 调优策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于 Redis 的一些新特性、使用建议
- 下一篇: 老程序员都去哪了?