Java程序占用CPU过高排查

文章介绍了如何通过top命令找到高CPU进程,接着使用top-H-p命令关注特定进程的线程,利用printf转换线程ID为16进制,然后借助jstack分析线程堆栈,特别是找到在mysql-cj-abandoned-connection-cleanup类的Object.wait()方法消耗CPU的情况。此外,文章还提到可以导出jstack日志文件进行离线分析,以帮助定位问题。
摘要由CSDN通过智能技术生成
  1. 使用 top 命令查看高CPU进程,执行命令后可以按 1 键查看各CPU 内核负载情况。CPU使用率主要看us、sy两个指标。

假设 10760 是一个高CPU的进程。

  1. 使用 top -H -p 查看 10760 的线程信息

top -H -p 10760

TIME列就是各个Java线程耗费的CPU时间。

  1. 以线程ID 10952的线程为例进行排查,将10952 转为16进制。后面排查日志时使用。

printf "0x%x\n" 10952

会得到10952的十六进制0x2ac8。

  1. 用jstack来输出进程ID 10760的堆栈信息,然后根据线程ID 10952的十六进制值0x2ac8 grep,如下:

jstack 10760 | grep 0x2ac8

可以看到CPU消耗在mysql-cj-abandoned-connection-cleanup这个类的Object.wait()。具体可以去代码中查看这个方法的实现,排查问题。

  1. 除了第4步,也可以将当前进程的所有堆栈信息导出,下载下来再分析。

jstack -l 10760 >> jstacklog.txt

下载jstacklog.txt到本地,搜索 0x2ac8 ,可以看到更详细的堆栈信息。

  1. 总结

上面的几个步骤演示了jstack命令的使用,不是一个实际的问题排查记录。在实际问题排查中,可能要反复查询第2步中列出的多个线程,再根据程序代码情况,综合判断出问题所在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weichao9999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值