Linux Tomcat 内存溢出定位与解决
一、先快速判断错误类型
tail -100 $CATALINA_HOME/logs/catalina.out | grep -i "OutOfMemoryError\|java.lang.OutOfMemoryError"。二、对应场景与解决方案
-verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps。-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/heap.hprof,用 Eclipse MAT/jvisualvm 分析泄漏对象与引用链。-XX:PermSize=256m -XX:MaxPermSize=512m)。-XX:MaxMetaspaceSize=512m;不设上限时受容器/系统内存约束)。ulimit -u(用户进程数)、ulimit -n(文件句柄);必要时调大并同步调整 Tomcat 的 maxThreads(在 conf/server.xml 的 Executor/Connector 中)。三、Linux 下正确修改 Tomcat 的 JVM 参数
export JAVA_OPTS="$JAVA_OPTS -server \
-Xms2g -Xmx2g \
-Xmn512m \
-XX:MaxMetaspaceSize=512m \
-verbose:gc -Xloggc:$CATALINA_HOME/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$CATALINA_HOME/logs/heap.hprof"
Environment="JAVA_OPTS=-server -Xms2g -Xmx2g -Xmn512m -XX:MaxMetaspaceSize=512m"
ExecStart=/opt/tomcat/bin/startup.sh
修改后执行:systemctl daemon-reload && systemctl restart tomcat。ps -ef | grep tomcat | grep -E "Xms|Xmx|MaxMetaspaceSize";或在 /manager/status(需配置用户)查看 Free/Total/Max memory。四、参数建议与常见坑
-Xms 与 -Xmx 等值,通常设为可用内存的50%–60%,不超过约80%;新生代 -Xmn≈-Xmx/4。-XX:MaxMetaspaceSize=…(如 512m/1g),避免无限制增长。JAVA_OPTS="$JAVA_OPTS …" 前未导出,或被其他脚本覆盖;建议统一在脚本前部 export 且避免重复拼接。