1. 调整JVM内存参数(最常见解决手段)
在Debian系统中,Tomcat的JVM内存参数需通过修改bin/catalina.sh(或bin/setenv.sh,若存在)文件中的JAVA_OPTS环境变量配置。关键参数包括:
-Xms(初始堆大小,如1g)和-Xmx(最大堆大小,如2g),建议两者设置为相同值以避免堆内存动态扩展的开销;-XX:MetaspaceSize(初始元空间大小,如256m)和-XX:MaxMetaspaceSize(最大元空间大小,如512m)替代Java 8以下的-XX:PermSize和-XX:MaxPermSize(永久代,已移除);-XX:NewSize(初始年轻代大小,如512m)和-XX:MaxNewSize(最大年轻代大小,如512m),用于优化新生代对象回收效率。export JAVA_OPTS="-server -Xms1g -Xmx2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:NewSize=512m -XX:MaxNewSize=512m"
修改后需重启Tomcat使配置生效。
2. 优化垃圾回收策略(提升内存回收效率)
选择合适的垃圾回收器并调整其参数,可减少内存溢出风险:
-XX:+UseG1GC启用,支持并行回收和大内存管理,适合高并发场景;可进一步调整-XX:MaxGCPauseMillis(目标最大GC停顿时间,默认200ms)和-XX:G1HeapRegionSize(Region大小,默认自动调整);-XX:+UseConcMarkSweepGC启用,适合低延迟应用,但需注意-XX:CMSInitiatingOccupancyFraction(触发CMS回收的堆占用率,默认70%)和-XX:+UseCMSInitiatingOccupancyOnly(仅使用设定阈值触发)参数。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log
日志路径需确保Tomcat有写入权限。
3. 优化Tomcat线程池配置(避免线程耗尽)
线程池耗尽可能导致内存溢出(如无法创建新线程)。修改conf/server.xml中的Connector配置,关键参数如下:
maxThreads:最大线程数(默认200),高并发场景可适当增加(如500),但需结合服务器CPU核心数(建议不超过核心数×2);minSpareThreads:最小空闲线程数(默认25),保持一定空闲线程以应对突发请求;acceptCount:等待队列长度(默认100),队列满后新请求将被拒绝,需根据并发量调整(如200)。<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="500"
minSpareThreads="50"
acceptCount="200" />
调整后需重启Tomcat。
4. 排查应用程序内存泄漏(根本解决之道)
内存泄漏是Tomcat内存溢出的常见根源,需通过工具定位泄漏点:
jmap命令生成堆转储(需知道Tomcat进程ID,用jps查看):sudo jmap -dump:format=b,file=/tmp/tomcat_heap.hprof <pid>
byte[]、String等),定位未释放的对象引用链;ThreadLocal变量未调用remove()方法,导致线程池中的线程持有对象无法回收;Map、List等集合不断添加对象,未及时清理;javassist)未卸载,导致元空间溢出。finally块中清理:ThreadLocal<byte[]> threadLocal = new ThreadLocal<>();
try {
threadLocal.set(new byte[1024 * 1024]);
// 业务逻辑
} finally {
threadLocal.remove(); // 关键:清理ThreadLocal
}
5. 系统层面优化(支撑Tomcat稳定运行)
lsof | wc -l
临时修改限制(立即生效):ulimit -n 65535
永久修改(需重启系统):编辑/etc/security/limits.conf,添加:tomcat hard nofile 65535
tomcat soft nofile 65535
(注:tomcat为运行Tomcat的用户,需替换为实际用户,如www-data);top、vmstat、iostat等工具监控CPU、内存、磁盘使用情况,及时发现资源瓶颈;或使用Prometheus+Grafana搭建可视化监控系统,长期跟踪Tomcat性能指标。