Java 高cpu消耗检测

2017-11-19  本文已影响73人  朝圣的路上

此篇博客主要记录当java程序出现较高的cpu消耗时如何检测和发现问题。基本思路是:

  1. 查找消耗cpu较高的进程;
  2. 追溯到该进程下的线程;
  3. 查看该线程下的堆栈日志。

linux下的主要步骤是通过top找到消耗cpu较高的进程,然后通过ps命令查看对应进程下的线程。最后通过jstack打印相应的堆栈日志,以找到相应的程序位置。此处推荐一篇博客。

《线上应用故障排查之一:高CPU占用》

windows下也是按照这个思路,但是windows下要找到相应的问题需要借助更多工具。这里就模拟一个问题,然后一步步追踪下去。

  1. 编写最简单的cpu消耗函数,并运行;
public class EmptyWhileTest {
    public static void main(String[] args){
        System.out.println("start to run an empty loop!");
        while(true){
            //do nothing
        }
    }
}
  1. 打开windows自带的任务管理器,查看消耗cpu较高的进程,可以看到PID=5620的进程,消耗cpu达到了25%;


    image.png
  2. 查找该进程下消耗cpu较高的线程,我这里用到了process explorer工具。下载解压直接运行就可以了。直接用这个,也可以省去第二步在任务管理器里面查看进程。找到相应的进程,然后右键,属性,就可以看到对应的线程了。

    进程.png 线程.png
  3. 线程ID是832,通过一些在线工具,换算成16进制就是0x340。


    image.png
  4. 切换到jdk的bin目录下面,用jstack打印相应的堆栈信息。

C:\Program Files\Java\jdk1.8.0_92\bin> jstack 5620

image.png
  1. 找到nid=0x340的线程,可以看到,EmptyWhileTest.java:6,正是我们产生空循环的地方。

这个就是简单的查找并定位cpu高消耗进程的方式。

上一篇 下一篇

猜你喜欢

热点阅读