本文目录#

获取线程转储#

  • jstack <pid>
  • jcmd <pid> Thread.print(包含锁占用信息)
  • kill -3 <pid>(Linux,将 dump 输出到标准输出)
  • JFR 事件 Thread Dump 或 JDK Mission Control 在线查看。

关键字段#

  • 线程名称/ID"http-nio-8080-exec-10" #32
  • 优先级/daemon 状态prio=5 os_prio=0 daemon
  • 状态java.lang.Thread.State: RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED
  • 栈帧:调用路径,关注自定义代码。
  • 锁信息- waiting to lock <0x...> (a java.lang.Object)

常见问题定位#

  • 死锁Found one Java-level deadlock: 段落,列出互相等待的线程。
  • 阻塞/锁竞争:大量线程处于 BLOCKED,查看持有锁的线程栈。
  • 线程池饱和:线程命名规则显示是否超出预期。
  • GC/FinalizerGC ThreadFinalizerReference Handler 等线程状态分析。

工具辅助#

  • TDA (Thread Dump Analyzer)、fastThreadIBM Thread and Monitor Dump Analyzer
  • IntelliJ IDEA Monitoring 插件可可视化分析。

最佳实践#

  • 收集多份线程转储:连续采集 3~5 份,间隔数秒;
  • 与 GC 日志、CPU 使用率、系统监控结合;
  • 保留 dump 与事件时间线,供复盘使用。

自检清单#

  • 是否确认线程状态与锁等待关系?
  • 是否标记关键业务线程并分析调用栈?
  • 是否将线程转储纳入故障应急流程?

参考资料#


本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。