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

JVM 與 Tomcat 性能調優實戰:GC 日誌分析、堆內存定型、收集器選型全記錄

     編輯:Java 相關知識

實驗環境

  • 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 -Xmx128mGC 間隔拉長,Young GC 主導↑預留餘量避免頻繁 GC
4-XX:+UseParallelGC多線程 Young GC,吞吐微升↑多核下 Parallel 優於 Serial
5/6-Xms64m -Xmx64m + Parallel/Serial堆小於穩態值,頻繁 GCParallel 略優單核環境 Parallel 無優勢
7-XX:+UseParNewGC (Young) + Serial (Old)混合模式中等不如純 Parallel

核心心法

  1. 先定堆:壓測找到穩態堆大小,設 -Xms=-Xmx=穩態值*1.2~1.5
  2. 選收集器:多核吞吐量優先 Parallel,大堆低停頓 G1,單核/小堆 Serial
  3. 看日誌:關注 Full GC 頻率/耗時、老年代回收後殘留、停頓分佈
  4. 小步快跑:每次調整單一參數,壓測對比,避免多變量干擾
  5. 業務優先:調優服務於 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved