[转帖]JVM CPU过高排查之路

jvm,cpu,排查,之路 · 浏览次数 : 0

小编点评

## 内容排版 **分析步骤:** 1. **top -Hp 9592** 显示 CPU 使用率最高的线程 ID 为 28178。 2. **printf %x 172 28178** 将线程 ID 转换为 16进制,结果为 6e12。 3. **jstack 9592** 获取该线程的栈信息,包含线程状态等信息。 4. **grep -10 6e12 "http-bio-8121-exec-199" daemon prio=10 tid=0x00007f751804b800 nid=0x6e12runnab** 获取线程的 Java 栈地址。 5. **分析代码:** * **SellerTransportModel.java:387** 循环遍历商品价格,并计算多出的钱。如果 addWeight 不等于 0,则进入死循环。 * **CartModel.java:1134** 获取购物车信息时,也进入死循环。 6. **修改代码:** * 当 addWeight 不等于 0 时,加入死循环,逐项添加价格到 `price` 中。 * 当死循环时,将价格加到 `price` 中,直到 `addWeight` 为 0为止。 **总结:** 该内容分析了 Java 代码中计算多出的钱过程中可能出现死循环的原因,并通过修改代码解决问题。

正文

https://www.jianshu.com/p/97860bbeb45c

 

双十一了,头一天晚上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过高排查之路相似的内容:

[转帖]JVM CPU过高排查之路

https://www.jianshu.com/p/97860bbeb45c 双十一了,头一天晚上10点左右收到阿里云cpu超过90%短信报警。 第二天上班了,开始处理,步骤如下: 1、top找出cpu高的java进程号9592 2、top -Hp 9592查看cpu占用time最高的线程编号281

[转帖]CPU或内存占用过高时,发生了什么

https://www.cnblogs.com/jmcui/p/10259359.html 在开发过程中,有时候我们发现 JVM 占用的CPU/内存居高不下,跟我们的预期不符,这时,CPU 在做什么呢?是什么线程让CPU/内存如此忙碌呢?我们通过如下几步,可以查看 CPU 在执行什么线程。 1、to

[转帖]JVM优化之调整大内存分页(LargePage)

转载自:http://jm.taobao.org/2009/11/21/3157/ 什么是内存分页? CPU是通过寻址来访问内存的。32位CPU的寻址宽度是 0~0xFFFFFFFF,即4G,也就是说可支持的物理内存最大是4G。但在实践过程中,程序需要使用4G内存,而可用物理内存小于4G,导致程序不

[转帖]JVM参数:-XX:ReservedCodeCacheSize

通过笨神的分享整理笔记: 这个参数主要设置codecache的大小,比如我们jit编译的代码都是放在codecache里的,所以codecache如果满了的话,那带来的问题就是无法再jit编译了,而且还会去优化。因此大家可能碰到这样的问题:cpu一直高,然后发现是编译线程一直高(系统运行到一定时期)

[转帖]【技术剖析】2. JVM锁bug导致G1 GC挂起问题分析和解决

https://bbs.huaweicloud.com/forum/thread-144146-1-1.html 发表于 2021-07-29 20:07:087037查看 作者:宋尧飞 编者按:笔者在AArch64中遇到一个G1 GC挂起,CPU利用率高达300%的案例。经过分析发现问题是由JVM

[转帖]【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列

【JVM】关于 JVM,你需要掌握这些 | 一文彻底吃透 JVM 系列 作者:冰河 2022-11-04 四川 本文字数:13519 字 阅读完需:约 44 分钟 写在前面 最近,一直有小伙伴让我整理下关于 JVM 的知识,经过十几天的收集与整理,初版算是整理出来了。希望对大家有所帮助。 JDK 是

[转帖]JVM metaspace outofmemory

https://www.jianshu.com/p/1ca44f94e42f 解决服务器进程退出问题(metaspace溢出) 现象 策划反应服务器进不去,远程看了一下进程消失了(crash) 有时候也会出现能登录,但是无法执行操作(进程还在),无法被正常shutdown 进程根目录下出现了java

[转帖]JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed)

https://www.jianshu.com/p/871d6bb3a32d JVM内存非典型术语介绍(shallow/retained/rss/reserved/committed) 背景 ​ 在服务器性能优化内存这一项时,有一些现象很诡异。如top显示的RES很大,但是实际jvm堆内存占用很小,

[转帖]jvm crash when overwritten running jar

https://www.jianshu.com/p/bf0a051e4c63 现象 策划热更完配置表后 jvm直接就crash了(开发机linux) crash日志 日志分析 从crash日志看是reload配置表 使用Reflections扫描配置类 最终读取jar包 java.util.zip.

[转帖]jvm一般相关配置OutOfMemoryError关参数配置解释

一般运行java应用都会根据实际情况设置一些jvm相关运行参数 特别是有关内存和oom溢出等参数,方便后续问题定位和解决 如常用的以下配置 nohup java -Xms256m -Xmx24g -Xmn8g -verbose:gc -XX:+PrintGCDateStamps -XX:+Print