- 使用
top
命令查找在大量占用CPU的进程的PID - 使用
ps -mp pid -o THREAD,tid,time
定位到大量占用CPU的线程TID;也可以用这个命令直接排序下,更方便找到大量占用CPU的线程:ps -mp pid -o THREAD,tid,time|uniq -c|sort -nr
- 将上述找到的线程TID转换成十六进制:
printf “%x\n” TID
,比如原本的线程TID是28802,可以用上面的命令转成十六进制数7082 - 使用PID以及刚刚转成十六进制的TID来打印出该线程的堆栈信息:
jstack PID|grep TID -A 100
。也可以把完整的堆栈信息输入到一个log文件里,有两种方法:- 方法一是用
kill -3 PID > threadDump.log 2>&1
,这种方法不适用于JDK1.6以上的版本 - 方法二是用
jstack -l PID > threadDump.log 2>&1
- 方法一是用
- 接下来就是分析堆栈信息,定位到问题代码的位置了。
下面简单介绍下上述命令的几个关键参数的含义:
ps命令:
-m 显示所有的执行者。
-p 指定进程的PID,并列出该进程的状况。
-o 用户自定义输出格式。
unic命令:
-c 检查文件是否已经按照顺序排序,排序过为真
sort命令:
-n 按照数值大小进行排序
-r 以相反的顺序进行排序,即降序排序,从大排到小
jstack命令:
-l long listing. Prints additional information about locks,会打印出额外的锁信息,可以在发生死锁时用来观察锁持有情况
-m to print both java and native frames (mixed mode),不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
kill命令:
-signal 指定发送的信号类型,比如:
-3是打印进程的线程信息,并不会终止进程;
-9是强制杀死进程,一般用于立即杀死无响应或者卡死的进程;
-15是柔和地终止进程,一般会在终止之前保存数据、关闭连接,需要经过一段时间后才会完全退出进程,效果等同于-TERM