Ubuntu如何解决Tomcat内存溢出
导读:Ubuntu下解决Tomcat内存溢出的实用步骤 一 定位错误类型 查看 $CATALINA_HOME/logs/catalina.out 或 localhost.<日期>.log,根据异常类型确认是堆、元空间还是栈问题:...
Ubuntu下解决Tomcat内存溢出的实用步骤
一 定位错误类型
- 查看 $CATALINA_HOME/logs/catalina.out 或 localhost.<
日期>
.log,根据异常类型确认是堆、元空间还是栈问题:
- Java heap space:对象太多或泄漏,堆不够用。
- PermGen space(Java 7 及更早):类、静态变量、JSP编译元数据过多。
- Metaspace(Java 8+):类加载过多或元空间泄漏。
- StackOverflowError:递归过深或线程栈不足。
二 快速修复 JVM 内存参数
- 编辑 $CATALINA_HOME/bin/catalina.sh,在文件靠前位置(如注释之后)添加 JAVA_OPTS。不同 Java 版本参数不同,建议值如下(请结合机器内存与应用规模调整,示例以 4GB 内存 为例):
| 场景 | 关键参数示例 | 说明 |
|---|---|---|
| Java 8 及更早(堆 + PermGen) | JAVA_OPTS=“-server -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=256m” | 将堆与永久代设大,避免 PermGen OOM |
| Java 8+(堆 + Metaspace) | JAVA_OPTS=“-server -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=512m” | 用 Metaspace 替代 PermGen,按需设上限 |
| 栈溢出 | JAVA_OPTS=“… -Xss256k” | 仅在出现 StackOverflowError 时考虑增大线程栈 |
- 通用建议:将 -Xms 与 -Xmx 设为相同值以减少堆动态扩缩带来的抖动;新生代可用 -Xmn 控制,例如约为堆的 1/4。修改后重启 Tomcat 生效。
三 验证参数是否生效与运行期观测
- 确认进程与参数:
- 查看 Java PID:pid=$(ps -ef | grep tomcat | grep -v grep | awk ‘{ print $2} ’)
- 查看 JVM 参数:ps -ef | grep $pid | grep -Eo ‘JAVA_OPTS=.*’
- 堆与 GC 观测:
- 堆分配:jmap -heap $pid
- GC 概况:jstat -gcutil $pid 1000 30
- GC 日志(便于深入分析):在 JAVA_OPTS 中加入 -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log,用日志判断是频繁 Full GC 还是晋升失败导致的 OOM。
四 常见诱因与对应处理
- 类与依赖过多(PermGen/Metaspace):清理无用依赖与重复 JAR,避免在 WEB-INF/lib 放置过大或重复版本的库;热部署频繁也会累积类元数据,生产建议减少热部署频率。
- 连接与文件句柄泄漏:检查 server.xml 连接数配置与业务代码中对 InputStream/OutputStream/Connection 的关闭;Linux 默认 open files 可能偏小(如 1024),可通过 ulimit -n 65536 提升,并在 /etc/security/limits.conf 持久化;用 lsof -p $pid | wc -l 观察句柄数。
- 查询与大对象:优化慢 SQL 与批量处理,避免在单次请求中加载超大结果集到内存;分页/流式处理大文件或导出任务。
五 示例配置与重启
- Java 8+ 示例(放在 catalina.sh 靠前位置):
- JAVA_OPTS=“-server -Xms2048m -Xmx2048m -XX:MaxMetaspaceSize=512m -verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log”
- 重启并验证:
- 重启:$CATALINA_HOME/bin/shutdown.sh & & $CATALINA_HOME/bin/startup.sh
- 验证:ps -ef | grep tomcat | grep -Eo ‘JAVA_OPTS=.*’ 与 jmap -heap 。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu如何解决Tomcat内存溢出
本文地址: https://pptw.com/jishu/776183.html
