如何查找占用CPU最高的线程及相关代码
场景:
某些线上服务,一段时间之内占用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了。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: 最常被遗忘的 Web 性能优化:浏览器缓存
- 下一篇: shiro-登录验证