①通过 top 命令找到占用cpu最高的 pid[进程id]

定位到pid是 1469
②通过 top -Hp pid 查看进程中占用cpu过高的 tid[线程id]
③通过 printf ‘%x/n’ tid 把线程id转化为十六进制
④通过 jstack pid | grep tid -A 30 定位线程堆栈信息
根据线程信息排查对应业务代码进行问题定位。
通过 jstat -gcutil pid 时间间隔 查看 gc 信息

可以发现伊甸园区和老年代都已经满了,且进行了大量的FGC
指标介绍
S0:年轻代第一个幸存区(survivor)使用容量占用百分比
S1:年轻代第二个幸存区(survivor)使用容量占用百分比
E:年轻代伊甸园区(eden)使用容量占用百分比
O:老年代使用容量占用百分比
P:perm代使用容量占用百分比
YGC:从应用程序启动到当前采样时年轻代gc的次数
YGCT:从应用程序启动到当前采样时年轻代gc的时间
FGC:从应用程序启动到当前采样时老年代gc的次数
FGCT:从应用程序启动到当前采样时老年代gc的时间
GCT:从应用程序启动到当前采样时gc总耗时
导出dump文件,使用jdk自带的jvisualvm.exe分析
使用 jmap -dump:format=b,file=name.dump pid 导出dump文件,一般dump文件会比较大【我的这个2.94G】,然后下载【可以用 sz name.dump】到本地用jvisualvm【jdk自带的,在bin目录下】分析
首先看下dump文件的概要

看看这些大对象都是什么

小结
cpu占用过高排查思路
top 查看占用cpu的进程 pid
top -Hp pid 查看进程中占用cpu过高的线程id tid
printf ‘%x/n’ tid 转化为十六进制
jstack pid |grep tid的十六进制 -A 30 查看堆栈信息定位
jvm old区占用过高排查思路
top查看占用cpu高的进程
jstat -gcutil pid 时间间隔 查看gc状况
jmap -dump:format=b,file=name.dump pid 导出dump文件
用visualVM分析dump文件
参考:https://mp.weixin.qq.com/s?__biz=MzU1MzUzODM2NQ==&mid=2247483824&idx=1&sn=25718af824474cf19ded821463a351bf&chksm=fbf007e2cc878ef4beb21204844dbe1805fe6d8c3c4e24c2831107cf020a25f330fcea13aec0&scene=21#wechat_redirect
本文介绍了当CPU使用率过高时,如何通过`top`、`jstack`、`jstat`和`jmap`等工具进行问题排查。主要步骤包括:定位占用CPU最多的进程和线程,观察JVM内存区域使用情况,分析垃圾收集行为,并通过导出dump文件使用jvisualvm进行深入分析。
6839

被折叠的 条评论
为什么被折叠?



