一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。
总体流程:
首先显示java进程的线程列表,查找运行时间长的线程:
或者使用top命令的线程模式:
然后按’H’,进入线程模式,第一列PID为tid(线程id)
其次将需要的线程ID转换为16进制格式:
最后打印线程的堆栈信息:
举个例子说明下:
1. 查找进程号
|
|
使用jps
命令显示当前的java进程,加上-v
参数可以显示进程的详情信息,更好的判断是否是关心的进程。
2. 查找耗时的线程号
一个进程下包含很多线程,我们关心的是那些线程运行了很长时间还没有结束,导致资源一直被占用。
第一种方法是使用ps
命令:
其中ps
命令查询进程的执行信息,-o
命令指定输出信息列,包含线程tid和线程执行时间。然后使用sort
命令按时间倒叙排序,取前10行。
第二种方法是使用top
命令:
首先输入
进入单个进程信息后,输入H
,进入线程模式:
接着输入T
,表示按时间倒叙排序:
注:
M %MEM
N PID
P %CPU
T TIME+
同样能找到耗时较多的线程号:43422。
3. 将线程ID转换为16进制格式
由于jstack
命令输出的线程id是使用16进制格式,所以我们要将tid转化为16进制进行搜索。
4. 在进程堆栈日志中查找
|
|
这样能看到具体线程执行情况,以及长时间执行的原因。