模擬占用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命令運行的
image.png
第二步:找到pid中,占用CPU高的tid(線程id)
- 使用top -Hp <pid>命令,查看pid中哪個tid占用CPU高
// 當前示例中的pid=69200,從下圖中可以看出,是69201這個tid占用CPU高
[root@rabbit-102 ~]# top -Hp 69200
image.png
- 或使用 ps H -eo pid,tid,%cpu | grep <pid> 命令也可以查看
[root@rabbit-102 ~]# ps H -eo pid,tid,%cpu | grep 69200
image.png
第三步:將10進制線程id,轉(zhuǎn)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
image.png
- 還可以使用 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
image.png




