此篇博客主要记录当java程序出现较高的cpu消耗时如何检测和发现问题。基本思路是:
- 查找消耗cpu较高的进程;
- 追溯到该进程下的线程;
- 查看该线程下的堆栈日志。
linux下的主要步骤是通过top找到消耗cpu较高的进程,然后通过ps命令查看对应进程下的线程。最后通过jstack打印相应的堆栈日志,以找到相应的程序位置。此处推荐一篇博客。
windows下也是按照这个思路,但是windows下要找到相应的问题需要借助更多工具。这里就模拟一个问题,然后一步步追踪下去。
- 编写最简单的cpu消耗函数,并运行;
public class EmptyWhileTest {
public static void main(String[] args){
System.out.println("start to run an empty loop!");
while(true){
//do nothing
}
}
}
-
打开windows自带的任务管理器,查看消耗cpu较高的进程,可以看到PID=5620的进程,消耗cpu达到了25%;
image.png
-
查找该进程下消耗cpu较高的线程,我这里用到了process explorer工具。下载解压直接运行就可以了。直接用这个,也可以省去第二步在任务管理器里面查看进程。找到相应的进程,然后右键,属性,就可以看到对应的线程了。
进程.png
线程.png
-
线程ID是832,通过一些在线工具,换算成16进制就是0x340。
image.png
-
切换到jdk的bin目录下面,用jstack打印相应的堆栈信息。
C:\Program Files\Java\jdk1.8.0_92\bin> jstack 5620

- 找到nid=0x340的线程,可以看到,EmptyWhileTest.java:6,正是我们产生空循环的地方。
这个就是简单的查找并定位cpu高消耗进程的方式。
网友评论