14.线程诊断_cpu占用高(top、ps H -eo pid,tid,%CPU | grep tid、clear、jstack pid)-------注意jstack输出的线程信息是16进制的

线程和虚拟机栈是息息相关的。

这里提供了一些线程诊断的一些案例,

有些时候我们需要学习掌握一些工具,有利于诊断我们的线程情况

来看第一个案例,有一个应用程序,cpu占用居高不下,影响了其他程序,怎么去诊断和排查呢?

这里是linux环境,这里说的是linux里的工具,很方便。

 

用nohup运行了一段java代码

linux的top命令可以检测到线程的内存占用情况

可以看到pid 32655 进程,cpu占用99%

top命令可以找到线程,但不知道哪一个线程。

我们再用ps命令,找到线程的占用情况。我们使用下面这段命令来找。

ps H -eo pid,tid,%cpu  #ps查看线程情况 -H打印进程树 eo输出所有感兴趣的内容 【所有线程的三项指标】
ps H -eo pid,tid,%cpu  | grep 32655 #grep 进程号,根据进程号进行过滤,只看进程32655的所有线程的三项指标

从这我们可以看到tid 32665 这个线程占用很高,达到了99.5但具体是程序的那一个线程造成的呢?我们可以使用jstack pid,它会输出相关堆栈信息。 


clear 清屏
jstack 进程id


 

 jstack输出的线程信息是16进制的,我们将tid 32665 用计算器转为10进制可以看到是 7f99

我们可以看到是thread1导致的cpu占用这么高。

 

 我们可以看到线程的状态,是一直runnable,就是它一直占用了,我们CPU的时间片。

我们还可以看到这个线程的第几行有问题,第8行有问题(活动栈帧嘛,一直居高不下)

 我们来看看java源代码

 

这里有一个while,就是因为线程的第8行有个死循环,所以才会CPU居高不下。

总结:我们使用了top命令查看了进程在运行时的CPU,内存相关信息。

我们再使用了ps H -eo pid,tid,%CPU | grep pid 定位到了此进程下的所有线程的CPU运行信息。

得到了CPU占用最高的tid。

我们再用jstack pid 输出了,该进程里所有线程运行情况。此输出的相关信息是16进制的。

我们将ps得到的tid(10进制)转为16进制,我们可以找到,该进程下对应的线程。

如例子中的thread1,并且定位到它目前的活动栈帧。

继而可以看看这块活动栈帧,为啥一直CPU居高不下。

继而可以排查问题。 奈斯~

上一篇:13.jvm内存结构部分——栈__内存溢出2_tgbyhn31的博客-CSDN博客

下一篇:​​​​​​​15.线程诊断_迟迟得不到结果(jstack排查死锁问题)_tgbyhn31的博客-CSDN博客

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值