如何排查CPU佔用過高以及常見的幾種情況
阿新 • • 發佈:2019-01-29
在最近上線過程中遇到cpu佔用率過高問題
由於問題已解決,此時僅重現操作方法
1.先用top命令,找到cpu佔用最高的程序 PID 如上圖
2.再用ps -mp pid -o THREAD,tid,time 查詢程序中,那個執行緒的cpu佔用率高 記住TID
3.jstack 29099 >> xxx.log 打印出該程序下執行緒日誌
4.sz xxx.log 將日誌檔案下載到本地
5.將查詢到的 執行緒佔用最高的 tid 上上上圖中 29108 轉成16進位制 --- 71b4
6.開啟下載好的 xxx.log 通過 查詢方式 找到 對應執行緒 進行排查
=======================================================================
容易出現cpu佔用過高的幾點
1.程式碼中寫死迴圈時,一直佔用cpu,如
如果加上執行緒睡眠時間,則釋放cpu佔用,不會一直搶佔cpu
2.如上在迴圈中不停的建立物件,也會導致GC頻繁 ---通過下圖,不讓死迴圈,頻繁建立物件
3.System.currentTimeMillis() 採用這種方式去做計時,大概佔用了10-20%cpu,因為不停的呼叫
解決方案: 採用一條執行緒來做計時
public class TimerThread extends Thread { public static volatile long TIMER = 0; public TimerThread() { setDaemon(true); } public void run() { while (true) { try { // ===計時每秒+1=== Thread.sleep(1000); TIMER++; } catch (InterruptedException e) { throw new RuntimeException(e); } } } }
4.C2 CompilerThread0 --這個執行緒大概在程序啟動前一段時間會佔用 10-20%cpu,後面會下降到1%,具體參照別人部落格
https://blog.csdn.net/chenxiusheng/article/details/74007750
5.FullGC 問題,現階段還沒遇到,遇到了再補充....