JVM性能优化之CPU负载过高

本文来说下JVM性能优化之CPU负载过高的问题


概述

一般性结论:一般来说,CPU占用高不高的问题,不是给定一个数值,例如90%以上就算高,以下就算正常,正常来说,随着程序的运行,CPU不断变化,百分之几,百分之几十,百分之百,都有可能,而CPU持续的高位,例如一直300%或者更多800%(多核),才可以认定为CPU占用过高问题。

对于java来说,频繁的IO读写,创建过多的线程,CPU都会较高,而线程死锁或者死循环基本是导致cpu高的罪魁祸首


程序测试

本人在Windows上编写了一个测试程序

package cn.wideth.buz.utils;

public class MyThread implements Runnable{

    @Override
    public void run() {

        long i = 0;

        //死循环会导致不断的IO操作,造成CPU偏高
        while(true){

            i++;
            if(i % 1000000 == 0){
                System.out.println(Thread.currentThread().getName() + " -->" + i);
            }
        }

    }

    public static void main(String[] args) {

        for(int i = 0; i < 3; i++){

            MyThread myThread = new MyThread();
            Thread thread = new Thread(myThread);
            thread.start();
        }
    }
}

问题定位

由于程序是在window上编写的测试程序,所以先到任务管理器中找到CPU占用比较高的进程的PID,如果是LINUX环境下,直接使用top命令得到进程占用比较多PID即可。

在这里插入图片描述

使用jstack -l PID命令得到定位线程信息

在这里插入图片描述

将线程信息保存在一个临时文件中,使用命令jstack -l 74680 > tempfile.txt即可

在这里插入图片描述

从当前进程的堆栈信息中定位到CPU占用比较高的代码

在这里插入图片描述


本文小结

如果线上出现了CPU过高的情况,一般是代码中出现了无限循环等情况。可以先找到CPU占用比较多的进程id,Linux中使用top命令,Windows中可以到任务管理器中查看,然后使用jstack -1 PID命令打印进内的堆栈信息,结合代码即可找到占用CPU的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值