CentOS 上 Tomcat 出现 GC 问题的定位与解决
一 快速定位与监控
export CATALINA_OPTS="\
-Xms2g -Xmx2g \
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails \
-XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime \
-XX:+PrintHeapAtGC \
-Xloggc:/var/log/tomcat/gc-$(date +%F).log"
export CATALINA_OPTS="\
-Xms2g -Xmx2g \
-Xlog:gc*:file=/var/log/tomcat/gc-%t.log:time,uptime,level,tags:filecount=10,filesize=10m"
/var/log/tomcat/gc-*.log {
daily
rotate 30
missingok
compress
copytruncate
}
二 常见症状与对应处理
症状 1:Young GC 每分钟上百次、接口抖动明显
症状 2:CMS 的 Remark 阶段 STW 过长(秒级卡顿)
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:CMSInitiatingOccupancyFraction=70
-XX:+CMSScavengeBeforeRemark
症状 3:日志出现 “GC overhead limit exceeded”
症状 4:周期性卡顿(如每周固定时段)
三 参数模板与落地步骤
CATALINA_OPTS="\
-Xms4g -Xmx4g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC \
-XX:CMSInitiatingOccupancyFraction=70 \
-XX:+CMSParallelRemarkEnabled -XX:+CMSScavengeBeforeRemark \
-XX:+PrintGCTimeStamps -XX:+PrintGCDetails \
-XX:+PrintGCApplicationStoppedTime \
-Xloggc:/var/log/tomcat/gc-$(date +%F).log"
CATALINA_OPTS="\
-Xms4g -Xmx4g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC -XX:MaxGCPauseMillis=200 \
-XX:InitiatingHeapOccupancyPercent=70 \
-Xlog:gc*:file=/var/log/tomcat/gc-%t.log:time,uptime,level,tags:filecount=10,filesize=10m"
四 实用工具与排错清单