- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JVM的CPU资源占用过高问题的排查
2021-07-12
上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题了,现在将问题排查步骤总结记录一下。(以下的图都不是线上问题的截图,涉及到公司业务)
?
1.通过top命令查看当前机器的CPU使用情况
此时发觉假如是Java的进程占用过高,并且一直下不来,则排查是什么线程导致占比过高。以图中进程举例,假如发觉PID为31357的Java进程占CPU比一直很高,则记录下它的PID
?
2.查看Java进程里面的线程的占用情况
top -H -p?31357
说明:-H 指显示线程,-p 是指定进程
可以看到CPU占用较高的线程,登记他们的PID,假设这里31357的CPU占比一直是50%
?
3.通过jstack命令猎取占用资源特别的线程栈,可临时保存到一个文件中查看
jstack 31357? jstack.31357.log
以上能看到指定线程的堆栈信息。
假如想看到关于线程中的锁的附加信息,可以加一个-l参数
4.上面方法用于进程正常情况下的堆栈打印,今日遇到的是用jstack -l命令没有响应,估量是CPU一直站着不能执行正常的命令,依据提示[The -F option can be used when?the target process is not responding]只能放大招了。
jstack -F “PID” jstack.“PID”.txt
吐出的实际日志结果如下:
发觉一大坨线程堵塞了,有用的结果在这里:明显一直在跑的是19576这个线程,一直在执行EXCEL导出的相关方法,问题就出在这里,下面的任务就是排查这个地方的代码规律了。
jstack命令格式:
jstack [ option ] pid
?
参数说明:
-F jstack [-l] pid无法响应时,强制打印堆栈
-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.
-m 混合模式输出(包括java和本地c/c++片段)堆栈。
pid: java应用程序的进程号
?
记得没错的话这几个参数是互斥的,不能联合使用。
?
5.后来搜材料发觉用jps命令查看java进程的pid更有用:
?
命令格式
jps [ options ] [ hostid ]
?
参数说明
-m 输出传递给main方法的参数,假如是内嵌的JVM则输出为null。
-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。
-v 输出传给JVM的参数。
?
三个参数加在一起显示更具体的信息:
发觉这些Java进程的启动参数中开放了JMX的近程端口,正常情况下可以通过jconsole近程连接过去看到JVM的日常参数。比如本地访问上图中的pay.war进程:
?
?
文档评论(0)