查看关键日志文件
catalina.out:记录启动、停止及错误信息,搜索ERROR、Exception、Deadlock等关键词。localhost.<date>.log:包含应用相关线程异常,如java.lang.ThreadDeath。分析线程状态
BLOCKED、WAITING、TIMED_WAITING等状态线程,可能为死锁或资源竞争。"http-nio-8080-exec-1" #123 prio=5 os_prio=0 tid=0x00007f8c00001234 nid=0x1234 waiting for monitor entry,表示线程因锁阻塞。jstack生成线程转储
jstack <Tomcat_PID> > thread_dump.txt,分析线程调用栈,查找死锁或长时间阻塞的线程。fastthread.io在线分析转储文件,识别死锁模式(如AB-BA锁竞争)。JMX监控线程池
jconsole或VisualVM连接Tomcat进程,查看Catalina:type=ThreadPool MBean,监控Active Threads、Queue Size等指标。maxThreads根据CPU核心数调整(I/O密集型可设为CPU核数×200),acceptCount避免队列积压。系统资源监控
top -H -p <Tomcat_PID>查看线程CPU占用,定位高负载线程。ulimit -n,避免因连接数过多导致Too many open files错误。| 问题类型 | 典型日志特征 | 解决方案 |
|---|---|---|
| 线程死锁 | Found one Java-level deadlock |
用jstack分析锁持有链,按固定顺序加锁或使用tryLock超时机制。 |
| 线程池耗尽 | java.util.concurrent.RejectedExecutionException |
增加maxThreads,优化业务逻辑减少线程占用,或启用连接池动态扩容。 |
| 资源竞争 | 高频同步块日志或Lock contention |
使用ReentrantLock替代synchronized,或通过ReadWriteLock分离读写操作。 |
| 内存泄漏 | OutOfMemoryError: Java heap space |
生成堆转储(jmap -dump),用MAT分析未释放对象,重点检查静态集合或数据库连接未关闭问题。 |
maxThreads,避免过度放大线程数导致上下文切换开销。ThreadLocal存储线程隔离数据。cron定时执行jstack和jmap,监控线程状态和内存使用趋势。参考来源: