GC日志是监控Tomcat内存使用情况的核心工具,可反映堆内存的分配、回收频率及效率。需先在Tomcat启动脚本中启用GC日志记录:
编辑$TOMCAT_HOME/bin/catalina.sh(或setenv.sh),添加以下JVM参数:
JAVA_OPTS="$JAVA_OPTS -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log"
参数说明:
-XX:+PrintGCDetails:输出详细的GC事件信息(如新生代、老年代的回收前后大小);-XX:+PrintGCDateStamps:在日志中添加时间戳,便于定位时间点;-Xloggc:/var/log/tomcat/gc.log:指定GC日志文件的保存路径(需确保目录存在且有写入权限)。分析要点:
catalina.out是Tomcat的标准输出日志,记录了应用运行中的关键事件(包括内存异常)。使用以下命令实时查看最新日志:
tail -f $TOMCAT_HOME/logs/catalina.out
重点关注:
java.lang.OutOfMemoryError: Java heap space,说明堆内存不足;若出现java.lang.OutOfMemoryError: Metaspace(Java 8+),说明元空间内存不足。需结合GC日志进一步分析原因(如堆内存设置过小或内存泄漏)。localhost.log记录了Tomcat内部组件的运行信息(如Servlet、Filter的执行情况),可帮助定位特定请求导致的内存异常。查看命令:
tail -f $TOMCAT_HOME/logs/localhost.log
分析场景:
若某个URL请求后,catalina.out中出现OOM错误,可通过localhost.log找到对应的请求时间点,分析该请求的资源消耗(如数据库查询结果集过大、缓存未清理等)。
当内存溢出发生时,生成堆转储文件(Heap Dump),可详细查看内存中的对象分布(如占用内存最多的对象类型)。需在启动脚本中添加以下参数:
JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof"
参数说明:
-XX:+HeapDumpOnOutOfMemoryError:当发生OOM时,自动生成堆转储文件;-XX:HeapDumpPath:指定堆转储文件的保存路径。分析工具:使用Eclipse MAT(Memory Analyzer Tool)打开堆转储文件,通过“支配树”“泄漏疑点”等功能,找出占用大量内存的对象(如未关闭的数据库连接、缓存中的大对象)。
/opt/apache-tomcat-9.0.xx/logs/);