查看关键日志文件
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
,监控线程状态和内存使用趋势。参考来源: