java进程cpu使用率高问题排查

以下对近期排查了一个生产cpu使用率高问题做个复盘:

简单说下过程
1、top查看耗时大进程
2、再top -Hp 进程id,查看耗时高的线程。
3、printf “%x\n” 线程id 转16进制,比如这里是4a71
4、jstack 19022 | grep 4a71 -A 50 找到线程执行栈信息。也可以jstack -l 进程号,看所有的,排查可疑。

jstack信息如下:
在这里插入图片描述
定位到关键代码:
在这里插入图片描述

找到代码位置:
在这里插入图片描述
再往下看:
在这里插入图片描述
这里是可疑代码,通过日志信息中的业务代码入口,找到了相对的Excel模板。发现模板整行被格式化。
本地执行验证确认了 getLastCellNumber()为一万六千多。这种情况下导出2000多行数据,即要循环4千万次左右。

这里的处理方式:
1、替换了格式模板,实际有效列十几列
2、对有效列数做了限定提示,不超50列。

后记

对应循环上千万次的效率,可以做个简单验证,这里以本地设备,执行循环输出一千万为例:

public class TestLoop {

    public static void main(String[] args){

        long start = System.currentTimeMillis();
        int i = 0;
        while(i < 10000000){
            System.out.println(i);
            i++;
        }

        System.out.println((System.currentTimeMillis()-start)/1000);
    }
}

输出结果:

9999995
9999996
9999997
9999998
9999999
64

Process finished with exit code 0

耗时64s。
所以循环及循环中的操作,要慎重考量。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值