jvm配置一启动就占用全部资源_一个线上JVM的CPU资源占用过高问题的排查

本文记录了一次线上JVM应用CPU占用过高的排查过程。通过`top`命令定位到Java进程,再使用`jstack`分析线程栈,最终发现是Excel导出方法导致的资源消耗。排查过程中还介绍了`jstack`、`jps`等工具的使用方法。
摘要由CSDN通过智能技术生成

上午线上某应用的一台JVM的CPU占比突然飙高到192%,并且一直下不来,导致监控一直告警,好久没处理这种问题了,现在将问题排查步骤总结记录一下。

1.通过top命令查看当前机器的CPU使用情况

62e066c65c22565b470d3e7142272354.png

此时发现如果是Java的进程占用过高,并且一直下不来,则排查是什么线程导致占比过高。以图中进程举例,假如发现PID为31357的Java进程占CPU比一直很高,则记录下它的PID

2.查看Java进程里面的线程的占用情况

top -H -p 31357

说明:-H 指显示线程,-p 是指定进程

48728e0df4470c31e2f31406dce397cc.png

可以看到CPU占用较高的线程,记下他们的PID,假设这里31357的CPU占比一直是50%

3.通过jstack命令获取占用资源异常的线程栈,可暂时保存到一个文件中查看

jstack 31357 > jstack.31357.log

975978f6d9e309646f9188e32a7eb30b.png

以上能看到指定线程的堆栈信息。

如果想看到关于线程中的锁的附加信息,可以加一个-l参数

2a2a3de550836eb62e6d2f09f10d51cb.png

4.上面方法用于进程正常情况下的堆栈打印,今天碰到的是用jstack -l命令没有响应,估计是CPU一直站着不能执行正常的命令,根据提示[The -F option can be used when the target process is not responding]只能放大招了。

jstack -F “PID” > jstack.“PID”.txt

吐出的实际日志结果如下:

9255889e7eeb81b32b6a4dd5ece266a3.png

发现一大坨线程阻塞了,有用的结果在这里:

91ebb47a5b0cf9f33b6b6df8b522d280.png

显然一直在跑的是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更实用:

d0bed3d2d5dbb994291d046ba8e3dbcc.png

命令格式

jps [ options ] [ hostid ]

参数说明

-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null。

-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

-v 输出传给JVM的参数。

三个参数加在一起显示更详细的信息:

7dd273c43c01b39d8fdb2d5019a45a4f.png

发现这些Java进程的启动参数中开放了JMX的远程端口,正常情况下可以通过jconsole远程连接过去看到JVM的日常参数。比如本地访问上图中的pay.war进程:

5cc73b5c9a850793b5c5d17226a04cbb.png

6706df86da23a13c8a87007f66594d94.png

8c42d766379be1c6d93bd11d47a67122.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值