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,轉載請註明文章地址