Java学习笔记

Java程序占用 CPU 过高排查

2023-07-19  本文已影响0人  想象之中丶意料之外

模拟占用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(进程)

第二步:找到pid中,占用CPU高的tid(线程id)

// 当前示例中的pid=69200,从下图中可以看出,是69201这个tid占用CPU高
[root@rabbit-102 ~]# top -Hp 69200

image.png

[root@rabbit-102 ~]# ps H -eo pid,tid,%cpu | grep 69200


image.png

第三步:将10进制线程id,转16进制

[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

// 保存堆栈信息到t.log中
[root@rabbit-102 ~]# jstack 69200 > t.log
//直接在t.log中筛选出10e51线程id的信息
[root@rabbit-102 ~]# cat t.log | grep 10e51 -A10


image.png

参考

上一篇下一篇

猜你喜欢

热点阅读