Java 佔用CPU使用率很高的分析
阿新 • • 發佈:2019-01-24
前幾天在測試伺服器上發現Java程序的CPU使用率暴高,為了分析解決該問題,把過程記錄如下:
1. 先找到Java的程序號
Linux下: 用top命令檢視所有程序,可以明顯看到Java的,因為CPU佔用率很高被排在前面。比如,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. 找到裡面是哪個執行緒佔用率最高
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。