window中java進程占用高問題解決


java程序cpu占用過高問題分析

標簽:  java  程序  cpu | 發表時間:2014-06-26 02:02 | 作者:陽光雨露
分享到:
出處:http://www.iteye.com

針對某個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下如何解決此問題我在此就不多說了,其它步驟是一樣的,只是用到的命令可能不一樣而已!

 


免責聲明!

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



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