windows 排查javaWeb程序占用CPU太高问题(可追踪到问题代码所在行)

1.情景展现

  java虚拟机占用这么高的CPU,确定不正常!  html

2.缘由分析

  第一个是tomcat,正在运行java项目;java

  第二个是eclipse,由于eclipse的运行依赖于java。json

  如今的问题是:tomcat的CPU使用率达到了90%,单独运行tomcat是不可能占用这么多CPU的,因此,问题就出如今:tomcat

  java项目的CPU占有问题。eclipse

  既然知道项目有问题,那就须要排查项目中具体哪一个java类中的哪行代码出了问题。工具

  将第一个应用程序也就是tomcat关闭后,CPU立马会降下来,这进一步证明了:是项目的问题。spa

3.解决方案

  工具:Process Explorer线程

  第一步:查看最占CPU程序所对应的pid3d

  打开该应用,第二栏就是CPU,默认将程序按照CPU的占有率进行倒序排列,即:最占CPU的程序会排在最前面。htm

  这个程序也就是tomcat,右侧有个pid列,其对应的值是:12240

  第二步:保存程序的线程信息

  打开DOS命令窗口,在cmd命令窗口中执行命令:jstack 12240 > C:\Users\Marydon\Desktop\problem.log。

  该命令的做用是将PID为12240的程序所包含的全部线程信息,保存在本地C:\Users\Marydon\Desktop\problem.log文件中。 

  第三步:查看占用CPU的线程

  Process Explorer中,选中最占用CPU的那个应用(javaw.exe)--》右键Properties--》切换到Threads栏--》默认将线程按CPU进行倒序排列。

  每行都表明一个线程,tid表明的就是该线程所对应的线程id(十进制)。

  第四步:在线程文件中查找该线程id

  根据该tid去log文件中查找,就能找到该线程所对应的java代码。

  因为,刚才导出的log文件中,存储的线程id是16进制的,而咱们在Process Explorer中看到的是10进制的tid,因此,咱们须要将十进制转换成16进制。

  以tid=12352的线程为例,转换成十六进制后为3040。

  打开刚才的log文件,查找3040(0x3040)

  意思是:WindowsSelectorImpl.java的第296行在使用该线程(也就是占内存的代码所在)

  去javaWeb项目中,打开WindowsSelectorImpl.java文件,跳到第296行,就是问题所在。

  一样的,对其它占用CPU高的线程也按这种方式进行排查便可。

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或须要补充更多内容,欢迎留言!!!

 相关推荐:

相关文章
相关标签/搜索