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高的線程也按這種方式進行排查便可。

 

寫在最後

  哪位大佬如若發現文章存在紕漏之處或須要補充更多內容,歡迎留言!!!

 相關推薦:

相關文章
相關標籤/搜索