1. 程式人生 > >Java 佔用CPU使用率很高的分析

Java 佔用CPU使用率很高的分析

前幾天在測試伺服器上發現Java程序的CPU使用率暴高,為了分析解決該問題,把過程記錄如下:

1. 先找到Java的程序號

Linux下: 用top命令檢視所有程序,可以明顯看到Java的,因為CPU佔用率很高被排在前面。比如, clip_image002
Windows下: 開啟工作管理員,然後點選 "檢視" 選單,然後點選 "選擇列",把pid勾上,然後就可以在工作管理員裡面看到所有程序的pid值了。(也可以用第三步中提到的工具直接檢視)

2. 做dump (可選)

jdk自帶的jstack工具可以檢視Java執行緒資訊,可以實時檢視,也可以匯出來。如果發現實時檢視不是很方便或者無法實時檢視,在做下列步驟前可以先dump。 jstack -l <pid> > dump.stack 如果程序已經hang住了,加-F引數 jstack -l -F <pid> > dump.stack 當然,如果是Unix下,還有種方法: kill -3 <pid>

3. 找到裡面是哪個執行緒佔用率最高

Linux下: 用 top -H -p <pid> 檢視該程序所有執行緒資訊,找到佔用率最高的那個 Windows下: 除了使用jvisualvm或者帶上top-thread外掛的jconsole之外,可以用Windows自己提供的三方工具—— Process Explorer v15.3 下載地址http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx


3. 得到執行緒號的16進位制

得到佔用率最高的執行緒ID後,要把它轉成16進位制 Linux下: printf "%x\n" <pid>
Windows下: 自帶的計算器可以提供該功能



4. 分析dump查詢問題程式碼片

可以用 jstack <pid> | grep -A <tid> 來實時獲取記憶體中該執行緒程式碼片,這裡<tid>是第3步中得到的16進位制的id 也可以在第2步中匯出的dump裡面查詢第3步中得到的執行緒id的十六進位制而找到程式碼片。

5. 如果有UI,可以有更簡單的辦法

JDK自帶工具jvisualvm和jconsole是非常強大的。其中jvisualvm原聲支援實時檢視執行緒CPU使用情況。 啟動jvisualvm,並檢視目標java程序資訊,然後選擇Sampler -> CPU -> Thread CPU Time


但是,這個sampler需要JMX支援,所以如果無法連線目標程式的JMX,就無法使用了。
jconsole並不能直接檢視,但是在jdk1.6 中,demo目錄下提供了一個top-thread的外掛可以檢視。1.7不知道為什麼沒了,可以猛擊這裡下載。 啟動jconsole時,帶上外掛引數: jconsole -pluginpath topthreads-1.1.jar

如果是指令碼啟動jconsole,比如JBOSS7自帶的jconsole.sh的話,把該jar包加入其classpath可以OK。