美文网首页Java学习笔记
Java程序占用 CPU 过高排查

Java程序占用 CPU 过高排查

作者: 想象之中丶意料之外 | 来源:发表于2023-07-19 11:42 被阅读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(进程)

    • 下图可以看到,当前占用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,转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

    参考

    相关文章

      网友评论

        本文标题:Java程序占用 CPU 过高排查

        本文链接:https://www.haomeiwen.com/subject/cfwoudtx.html