Ubuntu下Tomcat内存溢出怎么解决
导读:Ubuntu下Tomcat内存溢出定位与解决 一、快速判断与定位 查看异常类型:打开 $CATALINA_HOME/logs/catalina.out,搜索关键字 OutOfMemoryError。常见两类: Java heap spa...
Ubuntu下Tomcat内存溢出定位与解决
一、快速判断与定位
- 查看异常类型:打开 $CATALINA_HOME/logs/catalina.out,搜索关键字 OutOfMemoryError。常见两类:
- Java heap space:堆内存不足,通常伴随频繁 Full GC。
- PermGen space / Metaspace:类元数据区不足,常见于应用热部署、加载大量第三方 jar、JSP 预编译等场景。
- 检查系统资源限制:执行 ulimit -a,关注 open files、max memory size 等;必要时提升限制,避免因文件句柄或虚拟内存限制导致异常。
- 观察运行期指标:使用 jstat -gc 查看 YGC/FGC 次数与耗时;用 jmap -heap 查看堆配置与使用情况;必要时用 jmap -dump:format=b,file=heap.hprof 导出堆转储,配合 MAT 或 VisualVM 分析泄漏对象。
二、常见原因与对应处理
- 堆内存不足(Java heap space)
- 现象:日志出现 Java heap space;jstat 显示 FGC 频繁、老年代占用高。
- 处理:适当提升 -Xmx/-Xms,并优化代码/SQL/缓存等内存占用。
- 元空间不足(Metaspace,JDK 8+)
- 现象:日志出现 OutOfMemoryError: Metaspace;应用频繁热部署或依赖大量第三方 jar。
- 处理:设置 -XX:MetaspaceSize / -XX:MaxMetaspaceSize;减少重复 jar、避免无谓热部署。
- 永久代不足(PermGen,JDK 7 及更早)
- 现象:日志出现 PermGen space;JSP 预编译或大量类加载时更易触发。
- 处理:提升 -XX:PermSize / -XX:MaxPermSize(仅限 JDK 7-)。
- 文件句柄或系统限制
- 现象:访问变慢或失败,伴随 too many open files 等。
- 处理:提升 ulimit -n,排查连接泄漏与资源未关闭。
三、配置与优化步骤
- 设置 JVM 参数(推荐做法)
- 在 $CATALINA_HOME/bin/ 下创建或编辑 setenv.sh(没有则新建),加入参数并赋予可执行权限:
- JDK 8 示例(同时处理堆与元空间):
- JAVA_OPTS=“-Xms1024m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m”
- JDK 7 示例(使用 PermGen):
- JAVA_OPTS=“-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m”
- 如需 GC 日志(便于分析 Full GC 与内存趋势),追加:
- JAVA_OPTS=“$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -Xloggc:$CATALINA_BASE/logs/gc.log”
- JDK 8 示例(同时处理堆与元空间):
- 注意:
- 将 -Xms 与 -Xmx 设为相同可减少堆动态扩展带来的抖动;
- 堆上限不应超过物理内存的 80%,并预留给系统与其他进程。
- 在 $CATALINA_HOME/bin/ 下创建或编辑 setenv.sh(没有则新建),加入参数并赋予可执行权限:
- 应用与部署层面优化
- 避免静态集合长期持有对象、控制缓存大小、分批处理大数据、及时关闭 IO/DB 资源;
- 减少 WEB-INF/lib 中重复或过大的 jar,必要时使用共享类加载策略;
- 控制热部署频率,避免频繁类加载导致 Metaspace/PermGen 压力。
- 运维与监控
- 使用 jstat/jmap 持续观察,必要时导出 heap dump 分析;
- 对 catalina.out 按时间滚动切割(如 Cronolog),避免日志过大影响 I/O 与磁盘。
四、参数示例与适用场景
| 场景 | 建议参数(示例) | 说明 |
|---|---|---|
| 堆 OOM(JDK 8+) | JAVA_OPTS=“-Xms2g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m” | 固定堆大小,限制元空间上限 |
| PermGen OOM(JDK 7-) | JAVA_OPTS=“-Xms2g -Xmx2g -XX:PermSize=256m -XX:MaxPermSize=512m” | 仅适用于 JDK 7 及更早 |
| 需要 GC 诊断 | 在上例基础上追加:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:$CATALINA_BASE/logs/gc.log | 便于定位频繁 Full GC 与内存趋势 |
五、重启与验证
- 重启 Tomcat 并观察:
- 查看 catalina.out 是否仍有 OutOfMemoryError;
- 用 jstat -gc 观察 YGC/FGC 是否恢复正常;
- 检查 gc.log 是否存在异常 GC 模式;必要时再次 jmap -dump 复核对象分布。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu下Tomcat内存溢出怎么解决
本文地址: https://pptw.com/jishu/759907.html
