查找占用CPU时间最长的线程

记录下查找Java应用占用CPU时间最长的线程的过程。

获取进程ID

使用jps指令获取java服务进程ID:

命令结果如下:

其中19064即是目标java服务进程ID。

查询线程占用时间

使用top -H -p pid指令查询指定进程下的线程占用CPU的信息。

其中“-H”说明查询线程信息,“-p”指示进程ID, pid为进程ID。

执行命令如下:

执行结果如下:

输入大写P(shift + p)可以查看占用CPU最多的线程;输入大写T(shift + t)可以查看占用CPU时间最长的线程。

结果中第一列为线程ID。这里的线程ID是十进制的。因为jstack中的线程ID是以十六进制表示,所以需要将线程ID转为十六进制。

以第一行的线程ID 43225为例,使用如下命令进行转换:

转换结果为:

通过输出结果可知,43225对应的十六进制值是a8d9,通常记为“0xa8d9”。

找到线程进行定位

找到占用CPU较多的线程ID后,还需要将线程执行程序进行关联。

使用jstack命令打印线程堆栈信息,在堆栈信息中搜索十六进制的线程ID,如根据a8d9搜索到的结果为:

注意堆栈信息中的“nid=0xa8d9”,nid即表示十六进制线程ID。

根据堆栈信息可以看出这个线程是日志打印线程,占用CPU时间较长也是可以理解的。

就这样。

其他

如果为目标应用启用了jvm监控服务(如JSPY)的话,这套流程会简单许多——只需要先排序再查看就可以了。

再记录下top指令的一些交互命令:

 


发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据