java執行CPU佔用過高追蹤
流程執行命令:
1.top 查到pid 28555
2.ps aux|grep 28555 確定到是tomcat的程序
3.顯示執行緒列表 ps -mp 28555 -o THREAD,tid,time 查到tid 28802
4. printf "%x\n" 28802 將執行緒id,tid進行16進位制轉換
5.jstack pid |grep tid -A 30 顯示堆疊資訊 jstack 28555 |grep 28802 -A 30
詳細解釋看下文:
一個應用佔用CPU很高,除了確實是計算密集型應用之外,通常原因都是出現了死迴圈。
以我們最近出現的一個實際故障為例,介紹怎麼定位和解決這類問題。
根據top命令,發現PID為28555的Java程序佔用CPU高達200%,出現故障。
通過ps aux | grep PID命令,可以進一步確定是tomcat程序出現了問題。但是,怎麼定位到具體執行緒或者程式碼呢?
首先顯示執行緒列表:
ps -mp pid -o THREAD,tid,time
找到了耗時最高的執行緒28802,佔用CPU時間快兩個小時了!
其次將需要的執行緒ID轉換為16進位制格式:
printf "%x\n" tid
最後列印執行緒的堆疊資訊:
jstack pid |grep tid -A 30
找到出現問題的程式碼了!
最後,總結下排查CPU故障的方法和技巧有哪些:
1、top命令:Linux命令。可以檢視實時的CPU使用情況。也可以檢視最近一段時間的CPU使用情況。
2、ps命令: Linux命令。強大的程序狀態監控命令。可以檢視程序以及程序中執行緒的當前CPU使用情況。屬於當前狀態的取樣資料。
3、jstack: Java提供的命令。可以檢視某個程序的當前執行緒棧執行情況。根據這個命令的輸出可以定位某個程序的所有執行緒的當前執行狀態、執行程式碼,以及是否死鎖等等。
4、pstack:Linux命令。可以檢視某個程序的當前執行緒棧執行情況。