找到占用cpu最高的线程

1,使用命令top -p <pid> ,显示你的java进程的内存情况,pid是你的java进程号,比如123
2,按H,获取每个线程的内存情况
3,找到内存和cpu占用最高的线程pid,比如15248
4,执行 printf 0x%x 15248 得到 0x3b90 ,此为线程id的十六进制
5,执行 jstack 123|grep -A 10 3b90,得到线程堆栈信息中3b90这个线程所在行的后面10行

6,查看对应的堆栈信息找出可能存在问题的代码




场景:

   某些线上服务,一段时间之内占用CPU特别高,如何确认这是否属于正常情况还是代码中出现了异常导致占用CPU特高呢?如何定位确认是哪个线程导致的?如何确认下是哪部分代码导致的CPU使用率偏高呢?

     当然CPU使用高,并不一定意味着是有问题的,下面的方法仅用于排插问题的时候使用,例子也仅作为参考。(PS下面最终查询出来的具体代码使用CPU高是正常情况,这个需根据具体的业务场景去确认) 

方法:
    1、 使用 top命令确认是哪个进程占用CPU高。
     如下图,我们发现PID为15303的CPU使用率比较高。 


 2、使用 top -H -p PID的方式,查看指定进程的线程使用CPU的情况,以上图为例。
     输入top -H -p 15303。我们发现线程ID为19558的cpu使用率比较高。 


 3、使用jstack打印一下指定进程ID的java堆栈信息。命令如下:
jstack pid
     以上图为例,输入jstack 15303 ,执行之后查看dump信息。(可以将结果保存到文件中,方便以后查看 ,命令:jstack pid > 指定文件 )
     结果大体如下: 


4、上面咱们已经找到了占用CPU最高的线程,我们现在将线程的PID转换成16进制。
     19558转换成16进制的话,是4c66.
     我们在上面jstack中打印出来的dump信息里面,搜索4c66。可以得到如下结果: 


   我们可以发现,是MessageUtil和LinkedTransferQueue占用的CPU比较多,同时可以看出来sweep,unsplice等方法占用CPU比较多,所以后面的事情就是分析一下,这个是否是存在问题的就OK了。

猜你喜欢

转载自blog.csdn.net/shizhan1881/article/details/78592477