java虛擬機佔用這麼高的CPU,確定不正常! html
第一個是tomcat,正在運行java項目;java
第二個是eclipse,由於eclipse的運行依賴於java。json
如今的問題是:tomcat的CPU使用率達到了90%,單獨運行tomcat是不可能佔用這麼多CPU的,因此,問題就出如今:tomcat
java項目的CPU佔有問題。eclipse
既然知道項目有問題,那就須要排查項目中具體哪一個java類中的哪行代碼出了問題。工具
將第一個應用程序也就是tomcat關閉後,CPU立馬會降下來,這進一步證明了:是項目的問題。spa
工具: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高的線程也按這種方式進行排查便可。