温馨提示×

如何看tomcat内存溢出

小樊
47
2026-10-26 03:34:53
栏目: 智能运维

看 Tomcat 内存溢出(OutOfMemoryError),一般从 现象 → 日志 → 工具 → 参数 四个方面入手。下面给你一个实用排查指南。


一、常见 Tomcat 内存溢出类型

1. Java 堆内存溢出(最常见)

java.lang.OutOfMemoryError: Java heap space

原因:

  • 内存泄漏(对象一直被引用)
  • 并发量过大
  • JVM 堆设置太小

2. 永久代 / 元空间溢出

java.lang.OutOfMemoryError: PermGen space   (JDK7及以前)
java.lang.OutOfMemoryError: Metaspace        (JDK8+)

原因:

  • 加载类太多(如动态生成类、热部署)
  • 元空间未限制或太小

3. 栈溢出

java.lang.StackOverflowError

原因:

  • 递归过深
  • 线程栈设置过小

4. 直接内存溢出(NIO)

java.lang.OutOfMemoryError: Direct buffer memory

原因:

  • Netty / NIO 使用过多直接内存
  • -XX:MaxDirectMemorySize 未设置

二、从哪里看(日志位置)

1. Tomcat 日志

  • logs/catalina.out(最关键)
  • logs/catalina.YYYY-MM-DD.log

搜索关键字:

OutOfMemoryError
Exception in thread
GC overhead limit exceeded

2. 操作系统日志

  • Linux:/var/log/messages
  • dmesg | grep java

三、如何用工具分析

1. 查看 Tomcat 当前内存

jps
jstat -gc <pid>

示例:

jstat -gcutil <pid> 1000

关注:

  • OU(老年代使用率)
  • EU(伊甸区)
  • OOM 前是否接近 100%

2. 生成堆转储文件(非常重要)

在 catalina.sh 中加入:

export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/tomcat.hprof"

OOM 后会生成:

/tmp/tomcat.hprof

3. 分析堆文件

使用工具:

  • MAT(Memory Analyzer)(最推荐)
  • VisualVM
  • JProfiler

重点看:

  • 哪个对象占用内存最多
  • 谁引用了它(GC Roots)
  • 是否存在泄漏

四、Tomcat / JVM 参数建议

JDK8 示例

JAVA_OPTS="
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/tmp
"

修改位置:

  • bin/catalina.sh(Linux)
  • bin/catalina.bat(Windows)

五、常见优化方向

✅ 避免:

  • Session 不清理
  • 静态集合存对象
  • 频繁 reload 应用

✅ 优化:

  • 合理设置堆大小
  • 减少不必要的类加载
  • 使用连接池、限流

六、快速判断口诀

看日志 → 定类型 → 抓 dump → 分析对象 → 改参数


如果你愿意,可以把:

  • Tomcat 版本
  • JDK 版本
  • 报错完整日志

发给我,我可以帮你 精准判断是哪一类内存溢出。

0 踩