如何查找占用CPU最高的线程及相关代码

losetowin 发布于:2016-4-18 23:22 分类:Java  有 2424 人浏览,获得评论 0 条 标签: CPU jvm 进程 

本文地址:http://www.dutycode.com/chaozhao_shiyong_cpu_zuigaode_xiancheng.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。

标题其实还可以描述成:如何查找是哪些代码导致的CPU使用率高?

场景:

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

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

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


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


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


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


   我们可以发现,是MessageUtil和LinkedTransferQueue占用的CPU比较多,同时可以看出来sweep,unsplice等方法占用CPU比较多,所以后面的事情就是分析一下,这个是否是存在问题的就OK了。
      
如果上述内容存在不对的地方,还请帮忙指出,多谢~



版权所有:《攀爬蜗牛》 => 《如何查找占用CPU最高的线程及相关代码
本文地址:https://www.dutycode.com/chaozhao_shiyong_cpu_zuigaode_xiancheng.html
除非注明,文章均为 《攀爬蜗牛》 原创,欢迎转载!转载请注明本文地址,谢谢。