本文编写时,公司代码已被重构过,所以无法彻底重现当时环境。文章配图之间也已经过了多次 thread dump,所以 PID 与 TID 无法对上号。
最近公司一个新项目在测试环境运行的时候出现长期 CPU 占用 100% 的情况。经过检查,MySQL 和 SQL Server 均无慢查询以及长时间 IO 占用,最后将注意力集中在应用本身。
由于 Windows 自带的 Task Manager 功能太弱,请选择 Sysinternals 套件内的 Process Explorer 作为监测工具。
首先使用 Process Explorer 检查高占用的进程,记下 PID(Process ID),随后双击打开 Threads 选项卡

接下来请出 jstack, 他是 jdk 自带的线程堆栈分析工具,可以查看或导出 Java 应用程序中线程堆栈信息。
输入 jstack -l <PID>
输出 Thread Dump
如有必要,可将 Dump 导出,如 jstack -l <PID> > C:\trace.log
在 thread dump 中每个线程都有一个 nid, 将上述高占用的 TID 转成十六进制后, 找到与 dump 相对应的 nid。便是该线程的工作详情了。

得到了 dump 详情以后,就可以着手在对应的代码中找错优化了。