首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

JVM 性能調優權威指南:吞吐量優化實戰

     編輯:Java 綜合教學

吞吐量核心指標

  • TPS (Transactions Per Second):每秒完成事務數
  • QPS (Queries Per Second):每秒查詢請求數
  • 目標:最小化 GC 佔用 CPU 週期,最大化業務執行時間

CMS 收集器吞吐量調優

健康基線

  • Minor GC 開銷 < 10%
  • 總 GC 開銷 < 3% → 調優空間極小

三大調優手段

  1. 增大新生代:-Xmn 或 -XX:NewRatio,降低 Minor GC 頻率
  2. 增大老年代:減少 CMS 觸發頻率,緩解碎片
  3. 優化 CMS 啟動條件:-XX:CMSInitiatingOccupancyFraction=75(默認 92%),提前觸發避免 Full GC

Parallel GC (Throughput Collector) 調優

啟用參數

-XX:+UseParallelGC -XX:+UseParallelOldGC

目標

  • 避免 Full GC
  • GC 開銷 < 5%,達到 1% 則近極限

Survivor 空間手動調優

關閉自適應,觀察穩定態日誌:

-XX:-UseAdaptiveSizePolicy
-XX:+PrintAdaptiveSizePolicy

日誌關鍵字段

AdaptiveSizePolicy::update_averages:
  survived: 10464720      # 存活對象大小 (bytes)
  promoted: 1096456       # 晋升老年代大小
  overflow: true          # 是否溢出

計算最佳 Survivor

  1. 找出 Full GC 間隔期內所有 Minor GC 中最大 survived 值
  2. 預留 10-20% 緩衝 → 目標 Survivor 大小
  3. 調整 -XX:SurvivorRatio(Eden:Survivor = Ratio:1:1)

實戰案例

# 原配置
-Xmx1024m -Xms1024m -Xmn50m -XX:SurvivorRatio=3
# 算得:Eden=30M, Survivor=10M (各10M)

# 觀察到最大 survived ≈ 18M,需 Survivor ≥ 20M
# 保持 Eden 不變 (30M) → 新生代 = 30 + 20*2 = 70M
# SurvivorRatio = Eden/Survivor = 30/20 = 1.5
# 堆總大小 = 老年代(974M) + 新生代(70M) = 1044M

# 最終配置
-Xmx1044m -Xms1044m -Xmn70m -XX:SurvivorRatio=1.5

無法增大堆時的替代方案

-XX:TargetSurvivorRatio=80  # 默認 50%,提高至 80% 利用空間

並行線程數調優

-XX:ParallelGCThreads=4  # 建議 ≤ CPU 邏輯核心數,避免 GC 線程搶佔業務 CPU

其他高效能 JVM 參數

參數作用風險
-XX:+AggressiveOpts啟用實驗性優化可能不穩定
-XX:+DoEscapeAnalysis逃逸分析:標量替換、棧上分配、鎖消除極少
-XX:+UseBiasedLocking偏向鎖:無競爭時無鎖開銷高競爭場景反而慢
-XX:+UseLargePages大頁面:減少 TLB miss需 OS 支援 (hugetlbfs)

調優流程總結

  1. 建立基線:壓測記錄 TPS、GC 日誌、CPU/內存
  2. 識別瓶頸:GC 頻率高?停頓長?CPU 飆高?
  3. 單一變量調整:每次只改一個參數
  4. 驗證效果:對比基線,關注業務指標而非純 GC 指標
  5. 持續監控:生產環境接入 Prometheus/Grafana + JMX Exporter

吞吐量調優本質是空間換時間:用更大內存換更少 GC,用更多 CPU 核心換更快並行收集。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved