记一次 JVM CPU 使用率飙高问题的排查过程

点击关注公众号,Java干货及时送达👇

ca622f63f84b54242a8dfe4d5bd20811.png来源:guobinhit.blog‍p‍.csdn.net/article/details/70823903

  • 问题现象

  • 排查过程


问题现象

首先,我们一起看看通过 VisualVM 监控到的机器 CPU 使用率图:

af3ee99baf93fe29c958f2eb210e4a8a.png

图片

如上图所示,在 下午3:45 分之前,CPU 的使用率明显飙高,最高飙到近 100%,为什么会出现这样的现象呢?

排查过程

Step 1: 使用top命令,查询资源占用情况:

b8f9bde09cb4a86193b2a772f5ba2ac3.png

图片

如上图所示,显示了服务器当前的资源占用情况,其中PID为5456的进程占用的资源最多。

在这里,我们也使用top -p PID命令,查询指定PID的资源占用情况:

93b35ae943bdde9b202dd04b7e67278f.png

图片

Step 2: 使用ps -mp PID -o THREAD,tid,time命令,查询该进程的线程情况:

66fec69f16caf267652106753994388d.png

图片

在这里,我们也使用ps -mp PID -o THREAD,tid,time | sort -rn命令,将该进程下的线程按资源使用情况倒序展示:

1c48b081b6c2124935f007e2ff97ae31.png

图片

Step 3: 使用printf "%x\n" PID命令,将PID转为十六进制的TID:

fbf74d77b66646cc45ac2a167b781f63.png

图片

在这里,我们之所以需要将PID转为十六进制是因为在堆栈信息中,PID是以十六进制形式存在的。

Step 4: 使用jstack PID | grep TID -A 100命令,查询堆栈信息:

a5239dd230957437072032d7d8372d64.png

图片

如上图所示,显示该进程下多个线程均处于TIMED_WAITING状态。

虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU,但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。

而上面之所以会出现 CPU 使用率飙高的情况,则是因为有人在做压测。

特别地,在 mock 底层接口的时候,使用了类似TimeUnit.SECONDS.sleep(1)这样的语句。

至于为何在 下午3:45 分之后,CPU 的使用率降下来了,则是因为停止了压测。

除此之外,我们还可以使用jinfo和jstat命令来查询 Java 进程的启动参数以及 GC 情况:

使用jinfo PID命令,查询启动参数:

d9f64ec8d45dc20d752e271db42c6d8b.png

图片

如上图所示,使用该命令我们主要是为了查询启动参数,如初始化堆大小、垃圾回收器等配置。

使用jstat -gcutil PID 1000命令,查询 GC 情况:

df2b1840973925079356b1b6f6332ad2.png

图片

如上图所示,显示了PID为20567的 Java 进程每秒的 GC 情况,其中1000表示 GC 状态的更新频率,单位为毫秒。

 
 
 
 
 
 
 
 
(完)
码农突围资料链接1、卧槽!字节跳动《算法中文手册》火了,完整版 PDF 开放下载!
2、计算机基础知识总结与操作系统 PDF 下载
3、艾玛,终于来了!《LeetCode Java版题解》.PDF
4、Github 10K+,《LeetCode刷题C/C++版答案》出炉.PDF

欢迎添加鱼哥个人微信:smartfish2020,进粉丝群或围观朋友圈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值