java排查CPU占用过高

本文介绍了一种排查服务器CPU使用率异常高的方法,通过top命令定位高负载进程及线程,利用jstack获取线程堆栈,分析导致CPU资源过度消耗的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

排查思路

top -c  //-c表示显示整个命令行,而不只是显示命令名

结果如下:
在这里插入图片描述
PID=21900的进程占用CPU高,则查看该进程各个线程的cpu使用情况

top -Hp  21900

PID=21900的进程中 线程21961,21977占用CPU高
在这里插入图片描述
以打印线程21961堆栈为例,

printf "%x" 21961  //打印21961的16进制表示,结果为55c9
jstack 21900 | grep 55c9  //查看PID=21900的进程中线程21961(16进制为55c9)的堆栈

在这里插入图片描述
在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别。

Tips:

在top界面按一下1可以看到各个cpu使用情况
在这里插入图片描述
这时候我们可以清晰得看到每个cpu的运行状态。

通过上面的显示我们发现Cpu(s)表示的是 所有用户进程占用整个cpu的平均值,由于每个核心占用的百分比不同,所以按平均值来算比较有参考意义。而%CPU显示的是进程占用一个核的百分比,而不是整个cpu(12核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值