Linux下Tomcat内存溢出的常见原因及解决方法
Tomcat内存溢出主要表现为java.lang.OutOfMemoryError,常见子类及原因如下:
tail -100 /opt/tomcat/logs/catalina.out(路径根据实际安装位置调整)查找OutOfMemoryError相关日志,确定溢出类型。jconsole、jvisualvm(JDK自带)或top、free -m(Linux命令)监控Tomcat进程的内存占用(如堆内存、线程数),定位瓶颈。ulimit -a查看系统资源限制(如open files默认1024,max user processes默认可能较低),若值过小需调整(如ulimit -n 65535临时生效,需写入/etc/security/limits.conf永久生效)。bin/catalina.sh(Linux)或bin/catalina.bat(Windows),增加堆内存大小。建议将初始堆(-Xms)和最大堆(-Xmx)设置为相同值(避免频繁扩容),并根据服务器内存调整(如8GB内存可设置为-Xms2048m -Xmx2048m)。catalina.sh开头添加):export JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:NewRatio=3 -XX:SurvivorRatio=8"
其中-XX:NewRatio设置年轻代与老年代比例(默认2,年轻代占1/3),-XX:SurvivorRatio设置Eden区与Survivor区比例(默认8,Eden区占80%)。Map、List)。catalina.sh:export JAVA_OPTS="$JAVA_OPTS -XX:PermSize=256m -XX:MaxPermSize=512m"
建议MaxPermSize不超过Xmx的1/3。catalina.sh:export JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
Metaspace默认无上限(受物理内存限制),但建议设置MaxMetaspaceSize避免无限增长。java.util.concurrent.ThreadPoolExecutor)替代直接创建线程,设置合理的corePoolSize和maxPoolSize(如corePoolSize=50,maxPoolSize=200)。ulimit -u查看用户最大线程数(默认可能为1024),若需增加可修改/etc/security/limits.conf(添加tomcat soft nproc 65535、tomcat hard nproc 65535,tomcat为运行Tomcat的用户)。