1.、根据 jps -l 命令或者 ps -ef | grep java 命令找出对应的java应用程序对应的进程ID号,如下图所示,箭头处为进程ID。


2、 根据应用程序对应的进程ID查找该进程ID的全部线程,并且按照CPU使用率进行排序,占用CPU使用率最高的动态显示在第一行,这边以进程ID:27828为例,输入命令: top -H -p 27828,结果如下图所示,PID为8094即为该时刻线程CPU使用率最高的一个,将线程ID:8094 转换为16进制 输入命令:  printf "%x\n"  8094  结果为:1f9e  


3、使用 jstack命令,可以将某个进程的全部堆栈信息放入临时文件。这边将进程ID:27828 全部堆栈信息放入app目录下的temp.txt文件中。
输入如下命名: jstack 27828  >  /app/temp.txt 

jstack会将运行的程序全部堆栈信息输入到temp文件,如果不想使用导入文件的方式查看,可以直接输入以下命令也是可以直接定位到具体的线程。输入命令为: jstack 27828 | grep 1f9e 


4、使用vi命令查看该文件,输入:vi /app/temp.txt,然后输入步骤2中线程CPU使用率最高的转换后的16进制数字,输入 /1f9e 命名,按下enter键,看下是否可以查询到对应的信息,如果没有,则会提示如下内容

由于这时候该程序没有长时间占有大量的cpu的线程,说明程序比较健康,没有某个线程长时间占用cpu。为了演示,这边根据长时间占有cpu的程序展示下对应内容,如下图,23002转换为16进制后为:59da ,根据步骤1,2,3,导出堆栈信息,文件名为test.txt 

下图是光标显示的地方正是占有cpu使用率比较高的线程,通过查看该堆栈信息,一般都可以查到是哪个程序,这样对排查问题有一定的帮助

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐