在日常开发中,会碰到java版本的CPU很高,大部分时候会耗尽CPU资源,作者就碰到好几次,这里贴一下我的问题发现的过程。
作者第一次碰到是在linux系统下,代码进行过重构以后,每次运行,JAVA总是会耗尽CPU。linux系统为64位版本centos系统。
解决方法:
1、找到具体是哪个JAVA进程耗费的CPU资源,然后再定位到是进程中的哪些线程耗费CPU
这个可以使用linux下的命令 top,按照CPU资源进行排序,找到对应的进程PID。
使用JAVA jps命令找到该ID对应的java进程,知道是哪个JAVA进程耗费的CPU。
2、打印该JAVA进程的线程队列
使用jstack命令打印当前进程的线程堆栈调用信息
3、使用它top带 H 命令按照线程占用CPU情况进行展示,记录CPU很高的线程PID
根据步骤2打印的jstack线程堆栈的调用信息,如下图:
将记录的高CPU的线程ID与线程堆栈信息的nid进程比较,找到具体是哪个线程耗费的CPU,并最终定位到具体是哪块代码耗费的CPU,jstack命令产生线程堆栈信息的nid为16进制
windows环境下则较为复杂,是因为windows环境下没有类top命令,需要软件进程支持,读者可以下载windows自己的process explorer软件来查看具体是哪个线程耗费CPU。
如下图所示:
左边是进程列表,双击以后就可以对查看该进程的详细信息如下图:
剩下的步骤跟linux下相同