温馨提示×

怎么从日志查tomcat内存溢出

小樊
41
2026-10-05 13:59:16
栏目: 智能运维

下面按实际排障流程给你一套从日志查 Tomcat 内存溢出的方法,偏实战,不啰嗦。


一、先确认是不是“内存溢出”(OOM)

Tomcat 内存溢出通常表现为:

  • 页面卡死、接口无响应
  • java.lang.OutOfMemoryError 出现在日志中
  • Tomcat 进程突然退出或被 OS 杀掉

常见 OOM 类型(看错误信息最关键)

java.lang.OutOfMemoryError: Java heap space
java.lang.OutOfMemoryError: Metaspace
java.lang.OutOfMemoryError: GC overhead limit exceeded
java.lang.OutOfMemoryError: Unable to create new native thread

二、去哪里看日志(关键路径)

1️⃣ Catalina 日志(最重要)

$TOMCAT_HOME/logs/catalina.out
$TOMCAT_HOME/logs/catalina.YYYY-MM-DD.log

重点搜索:

grep -i "OutOfMemoryError" catalina.out

2️⃣ 应用日志(业务代码)

$WEBAPP/logs/xxx.log

看 OOM 前后是否有:

  • 大文件上传
  • 批量查询
  • 缓存无限增长

3️⃣ 系统日志(进程被杀)

如果是被 OS 杀掉:

dmesg | grep -i java
# 或
/var/log/messages

会看到:

Out of memory: Kill process (java)

三、如果是“进程直接挂了,没有 OOM 日志”

说明 没生成 heap dump,需要确认:

1️⃣ JVM 是否配置了 OOM 自动 dump

ps -ef | grep tomcat

看启动参数有没有:

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/dump.hprof

✅ 没有就加上(强烈建议)


四、从日志定位“哪里溢出”

1️⃣ 看异常堆栈

java.lang.OutOfMemoryError: Java heap space
    at com.xxx.service.UserService.query(UserService.java:120)

→ 直接定位类和方法


2️⃣ 看 GC 日志(非常关键)

如果开启了:

-Xloggc:/path/gc.log

看是否:

  • Full GC 频繁
  • 老年代一直满
  • GC 后内存不回收

五、常见导致 Tomcat OOM 的原因(结合日志判断)

现象 可能原因
heap space 集合无限增长、缓存未清理
Metaspace 动态生成类(反射、代理)
GC overhead 内存泄漏早期
native thread 线程池失控

六、推荐的标准排查组合(生产必备)

-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/dump/
-Xloggc:/data/gc.log
-XX:+PrintGCDetails

OOM 后:

  1. 看 catalina.out
  2. 看 dump.hprof(用 MAT / VisualVM)
  3. 定位占用最大的对象

如果你愿意,可以把 OOM 日志片段或 启动参数贴出来,我可以直接帮你分析是哪类问题。

0 踩