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

点击关注公众号,利用碎片时间学习


文章目录

  • 问题现象
  • 排查过程

问题现象

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

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

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

排查过程

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

感谢阅读,希望对你有所帮助 :) 

来源:guobinhit.blog.csdn.net/article/details/70823903

推荐:

最全的java面试题库

记一次 JVM CPU 使用率飙高问题的排查过程
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。“在看”支持我们吧!

原文始发于微信公众号(Java笔记虾):记一次 JVM CPU 使用率飙高问题的排查过程

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/37924.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!