垃圾收集器選擇參數
| 參數 | 收集器組合 | 適用場景 |
| -XX:+UseSerialGC | Serial + Serial Old | Client 模式默認,單線程,小應用 |
| -XX:+UseParNewGC | ParNew + Serial Old | 多核開發/測試,不推薦生產 |
| -XX:+UseConcMarkSweepGC | ParNew + CMS (Serial Old 備用) | 低延遲要求,Web 應用 |
| -XX:+UseParallelGC | Parallel Scavenge + Parallel Old | Server 模式默認,高吞吐量 |
| -XX:+UseParallelOldGC | 並行年老代 | JDK 1.5+ 已無效,默認開啟 |
JVM 內存區域大小參數
| 參數 | 含義 | 默認值 |
| -Xms | 堆初始大小 | 物理內存 1/64 (<1G) |
| -Xmx | 堆最大大小 | 物理內存 1/4 (<1G) |
| -Xmn | 新生代大小 | - |
| -Xss | 線程棧大小 | 平台相關 (通常 1M) |
| -XX:PermSize | 永久代初始大小 | 物理內存 1/64 |
| -XX:MaxPermSize | 永久代最大大小 | 物理內存 1/4 |
| -XX:NewRatio | 新生代:年老代比例 | 2 (即 1:2,新生代佔 1/3) |
| -XX:SurvivorRatio | Eden:Survivor 比例 | 8 (Eden 80%, 兩個 Survivor 各 10%) |
注意:JDK 8+ 移除永久代,改為 Metaspace,參數改為 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize。
通用 GC 性能參數
| 參數 | 含義 | 建議值 |
| -XX:PretenureSizeThreshold | 大對象直接進年老代閾值 | 0 (不限制),大對象可設 10M |
| -XX:MaxTenuringThreshold | 晉升年老代最大年齡 | 15 (默認),可調 5-10 |
| -XX:+DisableExplicitGC | 禁用 System.gc() | 建議開啟,防止誤調用 |
並行收集器專用參數
| 參數 | 含義 | 調優策略 |
| -XX:ParallelGCThreads | GC 線程數 | 默認 = CPU 核心數,可適當減少 |
| -XX:GCTimeRatio | 吞吐量目標 (1/(1+N)) | 99 表示 1% GC 時間,若不達標縮小新生代 |
| -XX:MaxGCPauseMillis | 最大停頓時間目標 | 優先滿足停頓,犧牲吞吐量和新生代大小 |
| -XX:+UseAdaptiveSizePolicy | 自適應調節策略 | 開啟後自動調整新生代、Survivor、晉升年齡 |
CMS 並發收集器專用參數
| 參數 | 含義 | 建議值 |
| -XX:CMSInitiatingOccupancyFraction | 觸發 CMS 回收的堆佔用比例 | 60-75,視應用分配速率調整 |
| -XX:+UseCMSCompactAtFullCollection | Full GC 後進行內存整理 | 開啟,減少碎片 |
| -XX:CMSFullGCsBeforeCompaction | 多少次 Full GC 後整理一次 | 0 表示每次,可設 5-10 平衡停頓 |
| -XX:+CMSParallelRemarkEnabled | 並行 Remark 階段 | 開啟,縮短停頓 |
| -XX:+CMSScavengeBeforeRemark | Remark 前先 Young GC | 開啟,減少 Remark 掃描對象 |
關鍵參數組合實戰模板
高吞吐量批處理應用
-server
-Xms4g -Xmx4g -Xmn3g
-XX:+UseParallelGC
-XX:ParallelGCThreads=8
-XX:GCTimeRatio=99
-XX:+UseAdaptiveSizePolicy
-XX:+DisableExplicitGC
低延遲 Web 應用
-server
-Xms4g -Xmx4g -Xmn1.5g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=5
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+DisableExplicitGC
大內存低延遲 (G1/JDK 9+)
-server
-Xms8g -Xmx8g
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:G1HeapRegionSize=16m
-XX:+DisableExplicitGC
調優核心思路
- 確定目標:吞吐量優先 → Parallel GC;延遲優先 → CMS/G1/ZGC
- 設置基線:固定 -Xms=-Xmx 避免震蕩,預設新生代
- 觀察指標:GC 頻率、耗時、停頓分佈、吞吐量、內存佔用
- 單參數調整:每次調整一個關鍵參數,對比效果
- 壓測驗證:模擬生產負載,長時間運行觀察穩定性
常用監控工具
- jstat -gcutil:實時 GC 統計
- jmap -heap:堆結構詳情
- VisualVM / JConsole:圖形化監控
- GC 日誌:
-Xlog:gc*:file=gc.log:time,uptime,level,tags (JDK 9+)
- Arthas / Greys:線上診斷
總結
JVM GC 參數眾多但核心邏輯清晰:選擇收集器 → 確定內存區域大小 → 設置性能目標 → 微調細節參數。沒有萬能配置,只有適合具體業務負載的配置。系統性調優需結合監控數據、壓測驗證、業務特點綜合判斷。