1. 调整JVM内存参数(最常见解决方式)
Debian上Tomcat的内存溢出多因JVM内存配置不足,需修改启动脚本中的JAVA_OPTS参数。对于Tomcat 7及以下版本,编辑/etc/default/tomcat7;对于Tomcat 8及以上版本,编辑bin/catalina.sh(在#!/bin/sh后添加)。关键参数设置:
-Xms)和最大堆(-Xmx)为相同值(如-Xms1024m -Xmx2048m),避免堆内存动态扩展的开销;-Xmn,如-Xmn512m),优化新生代垃圾回收效率;-XX:PermSize(初始永久代,如-XX:PermSize=128m)和-XX:MaxPermSize(最大永久代,如-XX:MaxPermSize=256m);Java 8及以上用-XX:MetaspaceSize(初始元空间,如-XX:MetaspaceSize=128m)和-XX:MaxMetaspaceSize(最大元空间,如-XX:MaxMetaspaceSize=256m),解决类元数据溢出问题。export JAVA_OPTS="-server -Xms1024m -Xmx2048m -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
调整后重启Tomcat使配置生效:sudo systemctl restart tomcat8。
2. 优化垃圾回收策略
选择合适的垃圾回收器并开启GC日志,帮助分析内存回收情况。对于Java 8及以上版本,推荐使用G1垃圾回收器(-XX:+UseG1GC),它在高并发场景下表现更优;若需详细GC日志,添加以下参数:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log
GC日志会记录每次垃圾回收的时间、回收前后堆内存变化,便于定位内存泄漏或GC效率问题。
3. 优化应用程序代码
内存溢出的根本原因常在于代码问题,需通过工具定位并修复:
jmap -dump:format=b,file=/tmp/heap.hprof <pid>生成),查找占用内存大的对象(如未释放的集合、静态引用、ThreadLocal未清理等);new操作),使用对象池(如数据库连接池、线程池)复用对象,及时关闭资源(如数据库连接、IO流);remove()方法清理。4. 系统层面优化
/etc/security/limits.conf,增加Tomcat进程的文件描述符限制(避免“Too many open files”错误),例如添加:tomcat soft nofile 65535
tomcat hard nofile 65535
重启Tomcat后生效;5. 监控与持续调优
-Xmx值);catalina.out、localhost.log)和应用日志,关注内存溢出相关的错误信息(如java.lang.OutOfMemoryError),提前预警问题。