JVM的CPU资源占用过高问题的排查
互联网后端架构 https://mp.weixin.qq.com/s/LiqAy2DikbmZzqogb5XRdA
JVM的CPU资源占用过高问题的排查
上午线上某应用的一台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进程:
最新文章
- Unity中各类物理投射性能横向比较
- unity 读取文本与写入文本
- Linuxmint&;win7
- python中的二维数组和lamda
- Lua 之os库
- Java设计模式-建造者模式(Builder)
- Jquery each和map 的区别
- CSS3实现轮播图效果
- Docker基础技术:Linux Namespace(上)
- Apache服务器中配置虚拟机的方法
- 蓝牙(3)如何通过蓝牙传输数据及UUID详介
- (原)caffe中通过图像生成lmdb格式的数据
- SSH2三大框架整合出错(四)
- Struts 2 初学的复习巩固
- hdu 5954 -- Do not pour out(积分+二分)
- zabbix基础服务搭建
- ABP vue+asp.net core yarn serve报 Cannot find module 'typescript/package.json错误
- uni-app 顶部导航点击更换图标
- jdbc工具类2..0
- torch.nn.Embedding
热门文章
- 01-offsetWidth和offsetHeight
- 安装oracle提示swap交换分区太小
- 算法复习——splay+启发式合并(bzoj2733-永无乡)
- 【DFS序+线段树区间更新区间求最值】HDU 5692 Snacks
- bzoj1734 [Usaco2005 feb]Aggressive cows 愤怒的牛 二分答案
- 请问 内网的 dns服务器 为什么和 外网的dns服务器 一样??
- Jackson工具类(各种转换)
- Mato的文件管理(bzoj 3289)
- POJ 2411 状压dp
- 一个关于 jquery 和 php 的 jsonp 例子(与后台PHP成功通信)