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

whdahanh 发布于 2023-08-31 767 次阅读


大家好,我是磊哥。

问题现象

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

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

排查过程

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

 

如上图所示分享一套 181G视频的Java架构师课程,累计更新时长1000+个小时显示了服务器当前的资源占用情况,其中PID5456的进程占用的资源最多。

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

 

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


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

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

 

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

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

 

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

虽然线程处于WAITING或者TIMED_WAITING状态都不会消耗 CPU分享一套 181G视频的Java架构师课程,累计更新时长1000+个小时但是线程频繁的挂起和唤醒却会消耗 CPU,而且代价高昂。

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

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

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

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

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


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

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

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

?磊哥私藏精品  热门推荐?

磊哥联合公司合伙人,一线大厂在职架构师耗时9个月联合打造2023年Java高级架构师课程》本课程对标外面3万左右的架构培训课程,分10个阶段,目前已经更新了181G视频,已经更新1000+个小时视频,一次购买,持续更新,无需2次付费
近期技术热文
科大讯飞,这次捂不住了(自爆了)

科大讯飞,这次捂不住了(自爆了)
科大讯飞,这次捂不住了(自爆了)
科大讯飞,这次捂不住了(自爆了)
第3版:互联网大厂面试题
包括 Java 集合、JVM、多线程、并发编程、设计模式、算法调优、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
阅读原文: 高清 7701页大厂面试题  PDF

本篇文章来源于微信公众号:作者:架构师专栏 架构师专栏 微信号 tech_column 功能介绍 专注原创,架构设计,Java后端、微服务、算法、技术栈 发表于
转载地址:https://mp.weixin.qq.com/s/RGpinhtcXFM1goj5GLc_mg



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2023-08-31