1. 程式人生 > >jvm cpu過高排查實戰

jvm cpu過高排查實戰

雙十一了,頭一天晚上10點左右收到阿里雲cpu超過90%簡訊報警。

第二天上班了,開始處理,步驟如下:

1、top找出cpu高的java程序號9592

2、top -Hp  9592檢視cpu佔用time最高的執行緒編號28178

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

   作者qq:511500623,轉載請註明文章地址