CPU使用率过高排查

本文介绍了当CPU使用率过高时,如何通过`top`、`jstack`、`jstat`和`jmap`等工具进行问题排查。主要步骤包括:定位占用CPU最多的进程和线程,观察JVM内存区域使用情况,分析垃圾收集行为,并通过导出dump文件使用jvisualvm进行深入分析。

①通过 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

在Linux系统下排查Java程序CPU使用率问题,可按以下方法进行: ### 1. 定位CPU占用的进程 使用`top`命令查看系统中各个进程的CPU占用情况。执行`top`命令后,按`P`键可以按照CPU使用率到低对进程进行排序,找到Java进程对应的`PID`(进程ID)。 ```bash top ``` ### 2. 定位CPU占用的线程 确定Java进程的`PID`后,使用`top -Hp <PID>`命令查看该进程下各个线程的CPU占用情况,同样按`P`键可按CPU使用率排序,记录CPU占用线程的`TID`(线程ID)。 ```bash top -Hp <PID> ``` ### 3. 将线程ID转换为16进制 因为Java的线程栈信息中线程ID是16进制显示的,所以需要将上一步获取的`TID`转换为16进制。可以使用以下命令进行转换: ```bash printf "%x\n" <TID> ``` ### 4. 生成Java线程栈信息 使用`jstack`命令生成Java进程的线程栈信息,将输出重定向到一个文件中,方便后续查看。 ```bash jstack <PID> > jstack.log ``` ### 5. 在线程栈信息中查找问题线程 使用上一步转换得到的16进制`TID`,在`jstack.log`文件中查找对应的线程栈信息,分析线程正在执行的代码,定位可能存在问题的代码段。可以使用以下命令进行查找: ```bash grep <16进制TID> jstack.log -A 30 ``` ### 6. 分析堆内存使用情况 使用`jstat`和`jmap`命令分析Java堆内存的使用情况,查看是否存在内存泄漏等问题。 - 使用`jstat`查看堆内存的使用统计信息: ```bash jstat -gc <PID> 1000 10 ``` 上述命令表示每1000毫秒输出一次堆内存的GC统计信息,共输出10次。 - 使用`jmap`生成堆转储文件: ```bash jmap -dump:format=b,file=heapdump.hprof <PID> ``` 生成的堆转储文件可以使用工具(如Eclipse Memory Analyzer)进行分析。 ### 7. 分析垃圾回收情况 使用`jstat -gcutil <PID> <interval> <count>`命令查看Java进程的垃圾回收情况,了解垃圾回收的频率和效率。 ```bash jstat -gcutil <PID> 1000 10 ``` 该命令每1000毫秒输出一次垃圾回收统计信息,共输出10次。 ### 8. 检查代码逻辑 结合线程栈信息和堆内存分析结果,检查Java代码逻辑,查看是否存在死循环、无限递归、锁竞争等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值