吞吐量是衡量系統處理能力的核心指標,本質是**減少 GC 佔用 CPU 週期,將更多算力歸還業務邏輯**。本文基於《Java 性能優化權威指南》核心思想,深度解析 CMS 與 Parallel GC 的吞吐量調優策略、Survivor 空間精準計算、並行線程優化與進階 JVM 參數,提供可落地的調優操作手冊。
核心指標定義
- 吞吐量 = 業務代碼 CPU 時間 / 總 CPU 時間
- **業務指標**:TPS(每秒事務數)、QPS(每秒查詢數)
- **GC 開銷閾值**:
- CMS:Minor GC 開銷 < 10%,< 3% 則調優空間極小
- Parallel GC:GC 開銷 < 5%,< 1% 已達極限
一、CMS 吞吐量調優三板斧
- 增大新生代 → 降低 Minor GC 頻率 → 減少 GC 總耗時
- 增大老年代 → 降低 CMS 觸發頻率 + 減少記憶體碎片 → 避免 Full GC
- 優化 CMS 啟動條件 →
-XX:CMSInitiatingOccupancyFraction 推遲觸發(默認 92%)→ 減少並發周期數
# CMS 吞吐量優化典型參數
-Xmx8g -Xms8g -Xmn3g
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80
-XX:+UseCMSInitiatingOccupancyOnly
二、Parallel GC 吞吐量調優核心:Survivor 空間精準計算
自適應調節 vs 手動調優
- 默認開啟
-XX:+UseAdaptiveSizePolicy,大多數場景足夠
- 高要求場景 → **關閉自適應,手動固定 Survivor**
關鍵日誌解讀
-XX:-UseAdaptiveSizePolicy -XX:+PrintAdaptiveSizePolicy
# 日誌示例
AdaptiveSizePolicy::update_averages: survived: 10464720 promoted: 1096456 overflow: true
| 指標 | 含義 |
| survived | Minor GC 後存活對象大小(進入 To Survivor) |
| promoted | 直接晉升老年代對象大小 |
| overflow | Survivor 空間不足導致過早晉升 |
實戰計算案例:從參數到優化
原始參數:
-Xmx1024m -Xms1024m -Xmn50m -XX:SurvivorRatio=3
推導:
- 原 Survivor = 10M,Eden = 30M(Ratio=3 → Eden:S0:S1 = 3:1:1)
- 日誌最大 survived = 10M → **目標 Survivor ≥ 20M**(預留 2 倍緩衝)
優化策略 A:保持 Eden 不變,擴大新生代
- 新生代 = 70M → Survivor = 20M →
-Xmn70m -XX:SurvivorRatio=1.5
- 老年代不變 → 堆總計 = 1044M →
-Xmx1044m -Xms1044m
優化策略 B:堆無法擴大,調整 TargetSurvivorRatio
- 統計 Minor GC 後存活對象:最小值/最大值/平均值
- 若波動小 →
-XX:TargetSurvivorRatio=80(默認 50%)→ 提高 Survivor 使用率
最終優化參數
-Xmx1044m -Xms1044m -Xmn70m -XX:SurvivorRatio=1.5
-XX:-UseAdaptiveSizePolicy
-XX:+UseParallelGC -XX:+UseParallelOldGC
三、並行 GC 線程數優化
-XX:ParallelGCThreads=N
- **建議值**:小於 CPU 核心數(留核給業務線程)
- 過多 GC 線程 → 上下文切換開銷 > 並行收益 → 業務延遲抖動
- 典型配置:8 核 → 4-6;16 核 → 8-10;32 核 → 12-16
四、進階性能優化參數速查
| 參數 | 作用 | 風險/建議 |
| -XX:+AggressiveOpts | 激進優化(編譯器、偏向鎖等) | 可能不穩定,測試環境驗證後上線 |
| -XX:+DoEscapeAnalysis | 逃逸分析 → 標量替換、同步消除、棧上分配 | JDK 7+ 默認開啟,確認未關閉即可 |
| -XX:+UseBiasedLocking | 偏向鎖:無競爭時無 CAS 開銷 | 高競爭場景反而降性能,可關閉 -XX:-UseBiasedLocking |
| -XX:+UseLargePages | 大頁面內存:減少 TLB Miss、頁表開銷 | 需 OS 支援(Linux hugetlbfs)、分配啟動慢 |
五、調優避坑指南
- 不要盲目複製參數:業務模型、對象壽命、硬體配置差異巨大
- 建立基準線:調優前收集 GC 日誌、GCause、業務指標
- 單變量原則:每次只調一個參數,觀察 2-3 個業務週期
- 關注分配速率:
Allocation Rate (MB/s) 決定 Minor GC 頻率,優先優化對象分配模式
- 大對象直入老年代:
-XX:PretenureSizeThreshold 避免新生代拷貝開銷
六、新一代 GC 選型建議(JDK 11+)
- G1:大堆(>6GB)、混合負載、可預測停頓 → 逐步替代 CMS
- ZGC / Shenandoah:超大堆(>16GB)、亞毫秒級停頓、延遲敏感型業務
- Epsilon:無 GC(測試/極短壽命任務)
- 上一篇文章: JVM 核心架構深度解析:運行時數據區、類加載、記憶體模型全景圖
- 下一篇文章: Java 核心基石:String 不可變性原理、內存模型與實戰陷阱全解析
Copyright ©
程式碼之家 All Rights Reserved