Tomcat日志是定位资源占用过高(如内存、线程、CPU)的重要线索来源,通过分析特定日志文件、关键词过滤及关联指标,可快速识别资源瓶颈。以下是具体步骤:
Tomcat的日志默认存储在$CATALINA_HOME/logs目录下($CATALINA_HOME为Tomcat安装根目录),核心日志文件包括:
内存占用过高通常伴随GC异常或堆内存增长,日志中需重点关注以下关键词:
catalina.sh中添加-Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps参数,生成的GC日志会记录每次垃圾回收的详情。若出现Full GC频率过高(如每分钟超过1次)、老年代回收效果差(Full GC后老年代使用量未明显下降)、GC暂停时间过长(如超过1秒),则说明内存不足或存在内存泄漏。catalina.out中搜索OutOfMemoryError(内存溢出)、GC overhead limit exceeded(GC开销超过限制)、Java heap space(堆内存不足),这些错误直接表明内存资源耗尽。线程占用过高会导致请求阻塞、响应变慢,日志中需关注线程池状态和阻塞信息:
maxThreads)决定了最大并发线程数。若日志中出现Thread pool exhausted(线程池耗尽)、Maximum number of threads (XXX) created(达到最大线程数),说明线程资源不足。BLOCKED(线程阻塞)、deadlock(死锁)、waiting for monitor entry(等待锁),这些关键词表明线程因竞争资源而停滞。例如,Deadlock detected: Thread-1 is waiting for a lock held by Thread-2直接提示死锁。CPU占用过高通常由频繁GC、线程竞争或代码热点引起,日志中可通过以下线索推断:
catalina.out中GC日志显示“Minor GC”或“Full GC”次数激增(如每秒1次),说明CPU可能在频繁处理垃圾回收,导致占用过高。jstack <tomcat_pid>生成线程转储,结合日志中的线程ID,查找长时间处于RUNNABLE状态的线程(如某线程持续执行数据库查询),这些线程可能是CPU占用的根源。localhost.YYYY-MM-DD.log记录了每个请求的响应时间(如%D字段),若某接口的响应时间突然变长(如从100ms增至1s),可能意味着该接口占用了大量资源(如数据库查询慢、代码逻辑低效)。top(查看CPU/内存占用)、vmstat(查看系统级资源瓶颈)、iostat(查看磁盘IO)等命令,将日志中的资源占用迹象与系统实际负载关联,确认是否为Tomcat自身问题还是外部因素(如磁盘IO瓶颈)。通过以上方法,可从Tomcat日志中快速定位资源占用过高的类型(内存、线程、CPU)及根源,为后续优化(如调整JVM参数、优化线程池、修复内存泄漏)提供依据。