Tomcat内存溢出处理指南
Tomcat内存溢出(Out Of Memory, OOM)是生产环境常见问题,主要表现为java.lang.OutOfMemoryError异常,需根据具体错误类型针对性解决。以下是常见场景及处理步骤:
堆内存是Tomcat存储对象的主要区域,需根据服务器物理内存合理配置:
%TOMCAT_HOME%\bin\catalina.bat,在文件开头添加:set JAVA_OPTS=-Xms512m -Xmx2048m -XX:MaxNewSize=512m
(-Xms:初始堆大小;-Xmx:最大堆大小;-XX:MaxNewSize:年轻代最大大小,建议为-Xmx的1/4~1/2)$TOMCAT_HOME/bin/catalina.sh,在文件开头添加:JAVA_OPTS="-Xms512m -Xmx2048m -XX:MaxNewSize=512m"
注意:-Xmx不宜超过物理内存的80%(如16G内存建议设为12G~14G),避免系统内存耗尽。catalina.bat/sh,添加:set JAVA_OPTS=-Xms512m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m
catalina.bat/sh,添加:set JAVA_OPTS=-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m
注意:元空间默认无大小限制,但需避免过度占用系统内存(建议设为256M~512M)。内存泄漏是导致OOM的常见根源,需通过以下方式排查:
Retained Heap(保留内存)大的对象(如缓存未清理、集合类未清空)。new对象);List、Map);LIMIT子句);try-with-resources语句)。ulimit -u,若值过小(如1024),需修改:ulimit -u 65535 # 临时生效
永久生效需修改/etc/security/limits.conf,添加:* soft nproc 65535
* hard nproc 65535
conf/server.xml中的Connector配置,减少maxThreads(如从200调整为100):<Connector port="8080" protocol="HTTP/1.1"
maxThreads="100" minSpareThreads="25" maxSpareThreads="75"
connectionTimeout="20000" redirectPort="8443" />
注意:maxThreads需根据并发量调整,避免设置过大导致线程数耗尽。旧版本Tomcat可能存在内存管理bug(如早期版本的JMX内存泄漏),建议升级到最新稳定版(如Tomcat 10.x),修复已知问题。
catalina.out、localhost.log,及时发现OutOfMemoryError异常并定位原因。通过以上步骤,可有效解决Tomcat内存溢出问题。需根据实际场景组合使用(如先调整JVM参数,再优化代码),并持续监控系统状态。