温馨提示×

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/EFKGrafana Loki,对 “OutOfMemoryError/GC” 等关键字配置告警,便于第一时间发现内存问题。

二 打开并解析 GC 日志

  • $CATALINA_HOME/bin/catalina.shJAVA_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 MATVisualVM 分析 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(关注 %MEMRSS
    • top -p $(pgrep -f tomcat)
  • 动态诊断(无需改配置):
    • jstat -gc :查看 YGC/YGCT、FGC/FGCT、GCT 等统计
    • jmap -heap :查看堆配置与实时使用
    • jcmd GC.run:建议触发一次 Full GC(仅在维护窗口)
  • 建议做法:将上述命令纳入 Shell/Python 巡检脚本,定时采集并推送到时序库或日志平台,形成趋势与阈值告警。

0