記java應用linux服務單個CPU使用率100%分析


之前在做項目的過程中,項目完成后在linux服務器上做性能測試,當服務跑起來的時候發現cpu使用率很奇怪,java應用把單個cpu跑滿了,其他cpu利用率0%。

  

 

剛開始遇到這問題的時候我第一時間反應使用java 自帶的jconsole工具去分析,具體遠程jconsole工具使用參考我另外一篇博客,分析結果后只發現創建了很多的es client對象,其他完全看不出任何異常。

我就把該部分代碼給屏蔽掉,再啟動服務的發現問題還是存在,那說明不是es 的client對象把cpu消耗了。

於是我又想到使用java的jvisualvm 工具,並且對代碼進行死循環和死鎖檢測,也沒有發現問題。

最后我使用了jstack工具分析出了當前正在使用cpu的線程,jstack的使用參考 http://blog.csdn.net/jiangguilong2000/article/details/17971247,上面有詳細說明步驟及說明。

最后分析結果:

 

查看結果,可以發現是  ContentManager類的init方法一致在執行,最后找到該代碼,

發現該代碼中有一個while(true)代碼,該代碼本來的用意是用來做一個消費者代碼解耦用的,現在看來這樣的寫法導致一個死循環,無法退出,所以造成cpu單核利用率達到100%。

到這里,造成cpu單核利用率100%的原因就算找到了,剩下的就是優化這段代碼了。

結論:

      經過請教公司的老員工和自己分析得到的結論就是代碼中如果出現死循環,就會造成單核CPU利用高的一個原因。

     所以以后在使用while(true)這樣代碼的時候得留意造成死循環。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM