CentOS中Tomcat内存溢出的处理步骤
TOMCAT_HOME/logs/catalina.out(或localhost.log)文件,寻找OutOfMemoryError相关错误信息(如java.lang.OutOfMemoryError: Java heap space、Metaspace溢出等),明确溢出类型。jconsole、jvisualvm(JDK自带)或YourKit、JProfiler(第三方)监控Tomcat进程的内存使用情况,观察堆内存、元空间、线程数等指标的变化趋势。jmap命令生成堆转储文件(heapdump.hprof):jmap -dump:live,format=b,file=heapdump.hprof <Tomcat_PID>
使用Eclipse MAT(Memory Analyzer Tool)分析堆转储文件,找出占用内存最多的对象(如缓存、静态集合、未关闭的连接等),定位内存泄漏点。TOMCAT_HOME/bin/catalina.sh(或setenv.sh),调整JVM内存参数:
-Xms:初始堆内存(如-Xms1g,建议与-Xmx一致,避免频繁扩容);-Xmx:最大堆内存(如-Xmx4g,不超过服务器物理内存的70%,避免占用过多系统内存)。PermGen(永久代)参数,使用-XX:MetaspaceSize(初始元空间大小,如-XX:MetaspaceSize=256m)和-XX:MaxMetaspaceSize(最大元空间大小,如-XX:MaxMetaspaceSize=512m),防止元空间溢出。-XX:NewSize=512m -XX:MaxNewSize=1g
export JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC"
-XX:+UseG1GC
-XX:CMSInitiatingOccupancyFraction(触发CMS回收的堆占用率,默认70%)和-XX:+UseCMSInitiatingOccupancyOnly(仅使用设定阈值)。finally块中调用threadLocal.remove(),避免线程复用导致对象无法回收;static Map)中长期持有,及时清理无用对象;close()方法(或使用try-with-resources语法)。new String()、new ArrayList()),重用已有对象(如使用StringBuilder代替字符串拼接);Caffeine、Ehcache等缓存框架设置maximumSize),避免缓存无限增长;TTL),及时清理冷数据,减少内存占用。ulimit -n 65535
/etc/security/limits.conf,添加以下内容(针对tomcat用户):tomcat hard nofile 65535
tomcat soft nofile 65535
/etc/sysctl.conf,添加fs.file-max=65535,执行sysctl -p使配置生效。sysctl -w net.core.somaxconn=65535 # 监听队列最大长度
sysctl -w net.ipv4.tcp_tw_reuse=1 # 复用TIME_WAIT状态的连接
sysctl -w net.ipv4.tcp_max_syn_backlog=8192 # SYN队列长度
将上述配置添加到/etc/sysctl.conf中,执行sysctl -p生效。jstat监控JVM内存回收情况(每1秒输出一次,共10次):jstat -gcutil <Tomcat_PID> 1000 10
关注O(老年代使用率)、M(元空间使用率)、YGC(年轻代GC次数)、FGC(Full GC次数)等指标,若FGC频繁或O接近100%,需进一步调整内存参数。JMeter、 Gatling等工具模拟高并发场景,测试Tomcat在不同负载下的内存使用情况,验证调整后的配置是否满足需求。通过以上步骤,可系统性地解决CentOS中Tomcat的内存溢出问题,提升应用的稳定性和性能。需根据实际应用场景和服务器配置灵活调整参数,避免过度分配内存影响系统整体性能。