實驗環境
- Linux Server + Tomcat + JMeter 壓測
- 基準應用:簡單 Web 接口
- 調優目標:最大化吞吐量、最小化 GC 停頓
關鍵 JVM 參數模板
# 基礎內存
-Xms512m -Xmx512m # 堆內存固定,避免動態擴縮容震盪
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m # 元空間固定
# GC 收集器選型(根據 JDK 版本與業務特點)
# 1. 並行收集器(吞吐量優先,多核)
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=4
# 2. CMS(低停頓優先,JDK 9+ 棄用)
-XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70
# 3. G1(大堆、可預測停頓,JDK 9+ 默認)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
# GC 日誌(必開,生產環境建議滾動)
-Xlog:gc*:file=/var/log/tomcat/gc-%t.log:time,uptime,level,tags:filecount=10,filesize=100m
# JDK 8 寫法
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log
-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M
# 其他常用
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof
-XX:+DisableExplicitGC # 禁用 System.gc()
-XX:-OmitStackTraceInFastThrow # 保留異常堆棧,利於排查
實戰調優六步走(節選)
| 輪次 | 參數變更 | GC 行為 | 吞吐量 | 結論 |
| 1 | -Xms50m -Xmx50m -XX:+UseSerialGC | 頻繁 Full GC,老年代 34M 滿 | 122/s | 堆太小,Serial GC 單線程瓶頸 |
| 2 | -Xmx80m(自動擴容觀察) | 堆穩定 80M,Full GC 減少 | -- | 探得穩態堆大小約 80M |
| 3 | -Xms128m -Xmx128m | GC 間隔拉長,Young GC 主導 | ↑ | 預留餘量避免頻繁 GC |
| 4 | -XX:+UseParallelGC | 多線程 Young GC,吞吐微升 | ↑ | 多核下 Parallel 優於 Serial |
| 5/6 | -Xms64m -Xmx64m + Parallel/Serial | 堆小於穩態值,頻繁 GC | Parallel 略優 | 單核環境 Parallel 無優勢 |
| 7 | -XX:+UseParNewGC (Young) + Serial (Old) | 混合模式 | 中等 | 不如純 Parallel |
核心心法
- 先定堆:壓測找到穩態堆大小,設
-Xms=-Xmx=穩態值*1.2~1.5
- 選收集器:多核吞吐量優先
Parallel,大堆低停頓 G1,單核/小堆 Serial
- 看日誌:關注
Full GC 頻率/耗時、老年代回收後殘留、停頓分佈
- 小步快跑:每次調整單一參數,壓測對比,避免多變量干擾
- 業務優先:調優服務於 SLA,別為指標而調優
常用參數速查分類
- Serial:
-XX:+UseSerialGC -XX:SurvivorRatio -XX:PretenureSizeThreshold -XX:MaxTenuringThreshold
- Parallel:
-XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads -XX:MaxGCPauseMillis -XX:+UseAdaptiveSizePolicy -XX:GCTimeRatio
- CMS:
-XX:+UseConcMarkSweepGC -XX:ParallelCMSThreads -XX:CMSInitiatingOccupancyFraction -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction
- G1:
-XX:+UseG1GC -XX:MaxGCPauseMillis -XX:GCPauseIntervalMillis
- TLAB:
-XX:+UseTLAB -XX:TLABSize -XX:+ResizeTLAB
- 通用:
-XX:+DisableExplicitGC -XX:+ExplicitGCInvokesConcurrent