jvm cpu过高排查实战

  • Post author:
  • Post category:其他


双十一了,头一天晚上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=


0x6e12


runnab  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,转载请注明文章地址



版权声明:本文为yx511500623原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。