由CPU问题定位java代码

阿凡达2018-08-01 13:23
  1. 背景

有时,线上集群load会突然飙升,无法响应正常请求。 那么引起load飙升的线程究竟在做什么?哪些线程霸占了CPU?可以通过top和jstack命令进行定位。


      2.  定位步骤

(1) 使用终端1进入目标机器,执行top命令,默认是“进程视图”,其中PID是进程号,截图如下:

在这里,我们只能看到java进程占用CPU达到115%,那么究竟是那些线程非常耗CPU呢?

(2) 由于我们要看到线程,在终端1,按下“H”键或者“shift+h”,top视图会切换到“线程视图”,其中PID是线程号,截图如下:

可以发现红框内的线程的CPU使用率非常高,占用CPU时间达到1秒左右,显然不正常,但是这些线程在做什么?

(3) 打开终端2,使用jstack命令输出这一时刻的线程栈,保存到文件,命名为jstack.log。注意:输出线程栈和保存top命令快照尽量同时进行。

(4) 由于jstack.log文件记录的线程ID是16进制,需要将top命令展示的线程号转换为16进制,以15100为例,在linux下输入命令:printf 0x%x 15100,得到15100的十六进制为0x3afc

(5) 在jstack.log中搜索0x3afc关键字,可以清晰看到该线程在做刷新地址列表


      3.  总结

以前碰到集群load飙升时,有时会束手无策,不知从何查起。以后再发生类似问题时,可以使用这个方法,看下究竟是那些线程在长时间占用CPU,尽快定位问题和解决问题。


本文来自网易实践者社区,经作者陈道秋授权发布。