JVM CPU过高排查之路

作者: Saxon_323e | 来源:发表于2018-12-06 21:49 被阅读0次

    双十一了,头一天晚上10点左右收到阿里云cpu超过90%短信报警。

    第二天上班了,开始处理,步骤如下:

    1、top找出cpu高的java进程号9592

    2、top -Hp  9592查看cpu占用time最高的线程编号28178

    说明:这个命令就能显示刚刚找到的进程的所有线程的资源消耗情况。找到CPU负载高的线程tid 28178, 把这个数字转换成16进制, 6e12(10进制转16进制,用linux命令: printf %x 172)

    3、执行 printf "%x\n" 28178 获取线程十六进制地址6e12 (十六进制一定要小写)

    4、执行 jstack 9592(pid)|grep  -10 6e12(线程十六进制号)

    "http-bio-8121-exec-199" daemon prio=10 tid=0x00007f751804b800 nid=0x6e12runnab  le [0x00007f74ebcf9000]

       java.lang.Thread.State: RUNNABLE

            at com.ejavashop.model.seller.SellerTransportModel.getFee(SellerTransportModel.java:387)

            at com.ejavashop.model.seller.SellerTransportModel.calculateTransFeeFuil  (SellerTransportModel.java:312)

            at com.ejavashop.model.cart.CartModel.getCartInfoByChooseId(CartModel.ja  va:1134)

            at com.ejavashop.service.impl.cart.CartServiceImpl.getCartInfoByChooseAn  dId(CartServiceImpl.java:201)

    5、排查代码SellerTransportModel.java:387

    for (int i = 0; i < surplus; i += addWeight) {

          price = price.add(new BigDecimal(addFee));//此线程一直在执行这一行代码。。。也就是说死循环原因导致cpu一直高

    }

    6、修改代码

     //计算多出的钱

    if(addWeight!=0){//线上死循环了

        for (int i = 0; i < surplus; i += addWeight) {

            price = price.add(new BigDecimal(addFee));

        }

    }

       7、打包测试,紧急上线,over

    相关文章

      网友评论

        本文标题:JVM CPU过高排查之路

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