当Tomcat日志中出现OOM(Out of Memory)错误时,通常表示Java虚拟机无法分配足够的内存资源,导致应用程序崩溃或性能下降。以下是一些解决和预防Tomcat OOM问题的步骤:
catalina.out
和 localhost.log
文件,寻找 OutOfMemoryError
、StackOverflowError
或线程死锁信息。top -p $(pgrep -f tomcat)
ps -eLf | grep tomcat | wc -l
java.lang.OutOfMemoryError: Java heap space
setenv.sh
中设置):export JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
Xms
和 Xmx
设为相同值避免动态调整开销。java.util.concurrent.TimeoutException
或请求卡死conf/server.xml
的Connector配置:<Connector
executor="tomcatThreadPool"
maxThreads="200" <!-- 默认200,根据负载调整 -->
minSpareThreads="20"
acceptCount="100" <!-- 等待队列长度 -->
/>
jstack $(pgrep -f tomcat) | grep "http-nio" | wc -l
jmap -dump:format=b,file=/tmp/heap.hprof $(pgrep -f tomcat)
jvisualvm
或 Eclipse MAT
分析泄漏对象。Too many open files
ulimit -n
/etc/security/limits.conf
):tomcat soft nofile 65535
tomcat hard nofile 65535
maxActive
是否过高)。SHOW STATUS LIKE 'Threads_connected';
jstat
观察GC情况:jstat -gcutil $(pgrep -f tomcat) 1000
FGC
列高)表明内存问题。kill -3 $(pgrep -f tomcat) # 输出到catalina.out
fastthread.io
在线分析死锁。通过以上步骤,可以有效地诊断和解决Tomcat日志中的OOM问题,并采取措施预防未来的发生。