使用 jstack 分析 Java 应用的线程堆栈状态

本文编写时,公司代码已被重构过,所以无法彻底重现当时环境。文章配图之间也已经过了多次 thread dump,所以 PID 与 TID 无法对上号。

最近公司一个新项目在测试环境运行的时候出现长期 CPU 占用 100% 的情况。经过检查,MySQL 和 SQL Server 均无慢查询以及长时间 IO 占用,最后将注意力集中在应用本身。

由于 Windows 自带的 Task Manager 功能太弱,请选择 Sysinternals 套件内的 Process Explorer 作为监测工具。

首先使用 Process Explorer 检查高占用的进程,记下 PID(Process ID),随后双击打开 Threads 选项卡

由图可知,TID 为 22172 的线程消耗大量的 CPU 时间。因而可以初步锁定问题所在。

接下来请出 jstack, 他是 jdk 自带的线程堆栈分析工具,可以查看或导出 Java 应用程序中线程堆栈信息。

输入 jstack -l <PID> 输出 Thread Dump

如有必要,可将 Dump 导出,如 jstack -l <PID> > C:\trace.log

在 thread dump 中每个线程都有一个 nid, 将上述高占用的 TID 转成十六进制后, 找到与 dump 相对应的 nid。便是该线程的工作详情了。

从图上我们可以看出,当前正在跑的 MainThread.java 的是第 36 行

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注