ubuntu

Ubuntu Tomcat日志中的线程问题诊断

小樊
46
2025-08-31 05:16:12
栏目: 智能运维

一、日志分析与定位

  1. 查看关键日志文件

    • catalina.out:记录启动、停止及错误信息,搜索ERRORExceptionDeadlock等关键词。
    • localhost.<date>.log:包含应用相关线程异常,如java.lang.ThreadDeath
  2. 分析线程状态

    • 日志中若出现BLOCKEDWAITINGTIMED_WAITING等状态线程,可能为死锁或资源竞争。
    • 示例:"http-nio-8080-exec-1" #123 prio=5 os_prio=0 tid=0x00007f8c00001234 nid=0x1234 waiting for monitor entry,表示线程因锁阻塞。

二、常用诊断工具

  1. jstack生成线程转储

    • 命令:jstack <Tomcat_PID> > thread_dump.txt,分析线程调用栈,查找死锁或长时间阻塞的线程。
    • 工具辅助:用fastthread.io在线分析转储文件,识别死锁模式(如AB-BA锁竞争)。
  2. JMX监控线程池

    • 通过jconsoleVisualVM连接Tomcat进程,查看Catalina:type=ThreadPool MBean,监控Active ThreadsQueue Size等指标。
    • 配置建议:maxThreads根据CPU核心数调整(I/O密集型可设为CPU核数×200),acceptCount避免队列积压。
  3. 系统资源监控

    • 使用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分析未释放对象,重点检查静态集合或数据库连接未关闭问题。

四、预防措施

参考来源

0
看了该问题的人还看了