模拟占用CPU高的代码
public class TestCpu{
public static void main(String[] args) {
cpu();
}
private static void cpu() {
int i = 0;
while (true){
i++;
}
}
}
//编译
[root@rabbit-102 ~]# javac TestCpu.java
//运行
[root@rabbit-102 ~]# java TestCpu &
排查步骤
第一步:使用top命令,查看占用CPU高的pid(进程)
- 下图可以看到,当前占用CPU最高的是69200进程,且是使用java命令运行的
第二步:找到pid中,占用CPU高的tid(线程id)
- 使用top -Hp <pid>命令,查看pid中哪个tid占用CPU高
// 当前示例中的pid=69200,从下图中可以看出,是69201这个tid占用CPU高
[root@rabbit-102 ~]# top -Hp 69200
- 或使用 ps H -eo pid,tid,%cpu | grep <pid> 命令也可以查看
[root@rabbit-102 ~]# ps H -eo pid,tid,%cpu | grep 69200
第三步:将10进制线程id,转16进制
- 直接使用 printf "%x\n" <tid> 命令即可
[root@rabbit-102 ~]# printf "%x\n" 69201
10e51
[root@rabbit-102 ~]#
第四步:使用jstack来查看java堆栈信息
*使用 jstack <pid> | grep <十六进制的tid> 命令来查看
// -A10 表示显示10行
[root@rabbit-102 ~]# jstack 69200 | grep 10e51 -A10
- 还可以使用 jstack <pid> > <filename> 将堆栈信息保存到文件中,然后自行分析
// 保存堆栈信息到t.log中
[root@rabbit-102 ~]# jstack 69200 > t.log
//直接在t.log中筛选出10e51线程id的信息
[root@rabbit-102 ~]# cat t.log | grep 10e51 -A10