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

JVM 與 Tomcat 性能調優實戰:從 GC 日誌到吞吐量優化

     編輯:Java 綜合教學

實戰環境與工具

  • Linux 服務器
  • JMeter 壓測工具
  • XShell 遠程連接
  • 一個 Web 應用

Tomcat JVM 參數配置於 catalina.sh(Windows 為 .bat)。本文通過 7 段配置演進,展示如何分析 GC 日誌、調整堆內存、選擇收集器,最終提升吞吐量。

配置 1:基準測試(Serial GC,堆 50M)

-Xms50m -Xmx50m -XX:+UseSerialGC -XX:PermSize=50m -XX:MaxPermSize=50m
-Xloggc:/home/log/gc.log -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError

結果:頻繁 Full GC,老年代 34MB 滿載,吞吐量 122.7 req/s,停頓時間長,配置不合理。

GC日誌:滿屏Full GC 聚合報告:吞吐量122.7/s

配置 2:增大最大堆(自動擴容至 80M)

-Xms50m -Xmx512m -XX:+UseSerialGC ...

現象:堆穩定在 80M 左右,Full GC 減少。此為尋找穩定堆大小的過渡配置。

配置2參數 穩定堆80M

配置 3:初始堆 128M,減少 GC 頻率

-Xms128m -Xmx128m -XX:+UseSerialGC ...

效果:吞吐量提升,GC 次數大幅下降,間隔拉長。

配置3參數 GC改善 吞吐量提升

配置 4:Parallel GC(多線程並行)

-Xms128m -Xmx128m -XX:+UseParallelGC -XX:+UseParallelOldGC ...

對比:無 GC 壓力時與 Serial GC 差異小;有壓力時並行優勢顯現。

Parallel GC參數 吞吐量略增

配置 5~6:小堆(64M)對比 Serial vs Parallel

堆 < 80M 觸發頻繁 GC。單核 CPU 下 Parallel GC 無優勢,甚至因線程切換開銷略遜於 Serial GC。結論:單核/弱並行環境首選 Serial GC。

配置5 配置5結果 配置6 配置6結果

配置 7:ParNew + Serial Old

-XX:+UseParNewGC

新生代並行、老年代串行。性能介於全串行與全並行之間。

ParNew配置 ParNew結果

常用 JVM 參數速查表

分類參數說明
串行收集器-XX:+UseSerialGC新生代/老年代均用串行收集器
-XX:SurvivorRatioEden 與 Survivor 區比例
-XX:PretenureSizeThreshold大對象直接進老年代閾值
-XX:MaxTenuringThreshold對象晉升老年代最大年齡
並行 GC-XX:+UseParNewGC新生代並行收集
-XX:+UseParallelOldGC老年代並行收集
-XX:ParallelGCThreadsGC 線程數,通常等於 CPU 核心數
-XX:MaxGCPauseMillis目標最大停頓時間
-XX:+UseAdaptiveSizePolicy自適應調整新生代大小、 Survivor 比例、晉升年齡
CMS 收集器-XX:+UseConcMarkSweepGC新生代並行、老年代 CMS+串行
-XX:ParallelCMSThreadsCMS 線程數
-XX:CMSInitiatingOccupancyFraction老年代佔用率觸發 CMS,默認 68%
-XX:+UseCMSCompactAtFullCollectionFull GC 後進行碎片整理
-XX:CMSFullGCsBeforeCompaction多少次 CMS 後做一次壓縮
-XX:+CMSClassUnloadingEnabled允許類元數據回收
G1 收集器-XX:+UseG1GC啟用 G1
-XX:MaxGCPauseMillis目標最大停頓
-XX:GCPauseIntervalMillis停頓間隔目標
TLAB-XX:+UseTLAB開啟線程本地分配緩衝
-XX:+PrintTLAB打印 TLAB 分配信息
-XX:TLABSize指定 TLAB 大小
-XX:+ResizeTLAB自動調整 TLAB 大小
其他-XX:+DisableExplicitGC禁用 System.gc()
-XX:+ExplicitGCInvokesConcurrent顯式 GC 走並發模式

核心心法

  1. 先找穩定堆大小:通過壓測觀察堆穩定水位,設定 -Xms/-Xmx 避免震盪。
  2. 根據硬件選收集器:多核用 Parallel/CMS/G1,單核用 Serial/ParNew。
  3. 關注業務指標:吞吐量、停頓時間、GC 頻率三角權衡。
  4. JDK 升級謹慎:新版本可能引入未知 Bug,需充分測試。

性能調優無銀彈,唯有「監測 → 分析 → 調整 → 驗證」的閉環實踐。

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