下面按实际排障流程给你一套从日志查 Tomcat 内存溢出的方法,偏实战,不啰嗦。
Tomcat 内存溢出通常表现为:
java.lang.OutOfMemoryError 出现在日志中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
$TOMCAT_HOME/logs/catalina.out
$TOMCAT_HOME/logs/catalina.YYYY-MM-DD.log
重点搜索:
grep -i "OutOfMemoryError" catalina.out
$WEBAPP/logs/xxx.log
看 OOM 前后是否有:
如果是被 OS 杀掉:
dmesg | grep -i java
# 或
/var/log/messages
会看到:
Out of memory: Kill process (java)
说明 没生成 heap dump,需要确认:
ps -ef | grep tomcat
看启动参数有没有:
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/path/dump.hprof
✅ 没有就加上(强烈建议)
java.lang.OutOfMemoryError: Java heap space
at com.xxx.service.UserService.query(UserService.java:120)
→ 直接定位类和方法
如果开启了:
-Xloggc:/path/gc.log
看是否:
| 现象 | 可能原因 |
|---|---|
| heap space | 集合无限增长、缓存未清理 |
| Metaspace | 动态生成类(反射、代理) |
| GC overhead | 内存泄漏早期 |
| native thread | 线程池失控 |
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/data/dump/
-Xloggc:/data/gc.log
-XX:+PrintGCDetails
OOM 后:
catalina.outdump.hprof(用 MAT / VisualVM)如果你愿意,可以把 OOM 日志片段或 启动参数贴出来,我可以直接帮你分析是哪类问题。