java程序cpu占用過高問題分析
標簽:
java
程序
cpu | 發表時間:2014-06-26 02:02 | 作者:陽光雨露
針對某個java程序cpu占用過高問題分析,要想找到問題的真正原因,首先要明確cpu過高的進程,通過對進程下線程的分析,定位到具體的應用代碼,從而定位問題的原因所在。
在jdk自帶的分析工具中,通過jconsole只能分析到應用程序的相關系統資源使用情況,但無法定位應用程序,故通過此工具了解到應用程序存在問題,但要具體定位到哪塊程序不合理造成的是很困難的。
通常java程序部署在windows或者linux下,首先來介紹一下windows下分析的步驟:
1:首先,要獲取windows下應用程序在操作系統中的進程id,查看的方式,可以從任務管理器中查看,也可以通過命令查看,通過任務管理器查看我這邊就不再累贅了,現在介紹一下通過命令查看的方式,首先打開cmd窗口,輸入tasklist命令:

此時發現在應用程序的進程id為6424
目前應用程序的cpu使用情況如下:

即項目一起動,程序沒有處理任何業務的情況下,cpu占用已經在49左右了,我截圖的時候還是偏低了情況。
其次,要分析一下為什么用占用過高的問題,接下來需要使用一個window的一個自帶命令,首先確認一下你的window是否安裝了pslist命令程序,如果命令不認別,可以上微軟的官網下載,下載地址為:http://technet.microsoft.com/en-us/sysinternals/bb896682.aspx
下載完直接解壓到C:\WINDOWS\system32下即可,此命令的作用是獲取進程下線程列表,比如說pslist -dmx 6424

從以上截圖是6424進程下線程的使用情況,可以發現線程3872的占用率很高,於是現在開始要定位到是哪個應用程序造成的問題
第三:在這里需要使用jstack jdk自帶的一個命令工具,關於jstack的用法,大家可以百度一下,網上關於這個命令的使用詳解很多,我在這就不再多說了,通過jstack 6424 >C:\test\cdf.log就可以獲取到程序的相關信息


最后:把占用cpu的線程的id轉換成16進行的數據

打開cdf.log文件,從中搜索f20,即可得到以下結果

即在at cn.sslsocket.SSLSocketClient.run(SSLSocketClient.java:239)中run方式就執行某段代碼出現占用過高的問題,經過代碼定位,發現在此處出現在了死循環,修復即可
通過以上分析,大家應該有一個比較清楚的了解,解決此類問題首先要知道怎么入手,接着要定位到問題的發生點,這樣才能從根本上解決問題。
關於linux下如何解決此問題我在此就不多說了,其它步驟是一樣的,只是用到的命令可能不一樣而已!