看 Tomcat 内存溢出(OutOfMemoryError),一般从 现象 → 日志 → 工具 → 参数 四个方面入手。下面给你一个实用排查指南。
java.lang.OutOfMemoryError: Java heap space
原因:
java.lang.OutOfMemoryError: PermGen space (JDK7及以前)
java.lang.OutOfMemoryError: Metaspace (JDK8+)
原因:
java.lang.StackOverflowError
原因:
java.lang.OutOfMemoryError: Direct buffer memory
原因:
-XX:MaxDirectMemorySize 未设置logs/catalina.out(最关键)logs/catalina.YYYY-MM-DD.log搜索关键字:
OutOfMemoryError
Exception in thread
GC overhead limit exceeded
/var/log/messagesdmesg | grep javajps
jstat -gc <pid>
示例:
jstat -gcutil <pid> 1000
关注:
OU(老年代使用率)EU(伊甸区)OOM 前是否接近 100%在 catalina.sh 中加入:
export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/tomcat.hprof"
OOM 后会生成:
/tmp/tomcat.hprof
使用工具:
重点看:
JAVA_OPTS="
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp
"
修改位置:
bin/catalina.sh(Linux)bin/catalina.bat(Windows)✅ 避免:
✅ 优化:
看日志 → 定类型 → 抓 dump → 分析对象 → 改参数
如果你愿意,可以把:
发给我,我可以帮你 精准判断是哪一类内存溢出。