Tomcat日志中如何监控内存使用
小樊
37
2025-12-18 10:33:26
Tomcat日志监控内存使用的实操指南
一 日志位置与快速筛查
- 关注的核心日志文件是 catalina.out(常见路径:/var/log/tomcat/ 或 $CATALINA_HOME/logs/)。使用命令实时查看与过滤内存相关异常:
- 实时查看:tail -f /var/log/tomcat/catalina.out
- 关键字筛查:grep -i “OutOfMemoryError|memory|GC” /var/log/tomcat/catalina.out
- 典型内存异常在日志中的表现形式:
- Java 堆内存不足:java.lang.OutOfMemoryError: Java heap space
- 元空间不足(Java 8+):java.lang.OutOfMemoryError: Metaspace
- 永久代不足(Java 7 及更早):java.lang.OutOfMemoryError: PermGen space
- 建议做法:将 catalina.out 接入 ELK/EFK 或 Grafana Loki,对 “OutOfMemoryError/GC” 等关键字配置告警,便于第一时间发现内存问题。
二 打开并解析 GC 日志
- 在 $CATALINA_HOME/bin/catalina.sh 的 JAVA_OPTS 中开启 GC 日志(示例为 JDK 8;JDK 9+ 建议迁移到统一日志):
- -verbose:gc
- -XX:+PrintGCTimeStamps
- -XX:+PrintGCDetails
- -Xloggc:/var/log/tomcat/gc.log
- 重启 Tomcat 后,tail -f /var/log/tomcat/gc.log 观察。GC 行示例与要点:
- 示例:212951: [GC 212951: [DefNew: 57244K->1469K(57664K), 0.0277 secs] 281666K->225899K(523712K), 0.0279 secs]
- 读法:箭头左侧为回收前,右侧为回收后;“()”内为当前区容量;整体观察老年代使用是否持续逼近 -Xmx 且 Full GC 后仍不回落,往往意味着内存压力或泄漏。
- 建议做法:将 GC 日志纳入日志平台,按应用与实例分片存储,结合时间轴观察 GC 频率与停顿时长趋势。
三 OOM 时自动落盘与离线分析
- 在 catalina.sh 增加 OOM 快照参数,便于定位泄漏根因:
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath:/var/log/tomcat/oom/heap-$(date +%F-%H%M%S).hprof
- 发生 OutOfMemoryError 后,从 HeapDumpPath 获取 .hprof 文件,使用 Eclipse MAT 或 VisualVM 分析 Dominator Tree、Leak Suspects 与对象引用链,定位占用内存最多的类与线程栈。
- 实战案例提示:若请求头过大(如 maxHttpHeaderSize 设置过大),会导致 Http11OutputBuffer 与巨型 byte[] 占用过多堆空间,进而触发 OOM;通过堆转储可快速识别此类问题。
四 通过 JMX 与可视化工具持续监控
- 在 catalina.sh 启用 JMX(仅内网/安全网络使用;生产请开启认证与 SSL):
- -Dcom.sun.management.jmxremote
- -Dcom.sun.management.jmxremote.port=9999
- -Dcom.sun.management.jmxremote.authenticate=false
- -Dcom.sun.management.jmxremote.ssl=false
- 使用 JConsole/VisualVM 连接 localhost:9999,在“内存”页查看 Heap/Non-Heap、各内存池(如 Eden、Survivor、Old/Metaspace)使用曲线,并可手动触发 GC 与导出堆转储。
- 大规模或自动化场景:部署 JMX Exporter 将指标暴露给 Prometheus,在 Grafana 建立内存与 GC 可视化面板并设置阈值告警。
五 命令行与脚本的辅助巡检
- 快速查看 Tomcat 进程内存占用:
- ps -aux | grep tomcat(关注 %MEM 与 RSS)
- top -p $(pgrep -f tomcat)
- 动态诊断(无需改配置):
- jstat -gc :查看 YGC/YGCT、FGC/FGCT、GCT 等统计
- jmap -heap :查看堆配置与实时使用
- jcmd GC.run:建议触发一次 Full GC(仅在维护窗口)
- 建议做法:将上述命令纳入 Shell/Python 巡检脚本,定时采集并推送到时序库或日志平台,形成趋势与阈值告警。