双十一,第一天晚上10点左右收到阿里云cpu超过90%的短信报警。
第二天上班,开始处理,步骤如下:
1、top找出cpu高的java进程号9592
2、top -Hp 9592查看cpu占用time最高线程编号28178
3、执行 printf "%x\n" 28178 获取线程16进制地址6e12 (十六进制必须小写) 4、执行 jstack 9592(pid)|grep -10 6e12(线程16进制号)
"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!={///在线死循环 for (int i = 0; i < surplus; i = addWeight) { price = price.add(new BigDecimal(addFee)); } } 7.包装测试,紧急上线,over
数据地址:记一次 JVM CPU 利用率飙升的排查过程_CG国斌的博客-CSDN博客_cpu飙高 jvm