1. 程式人生 > >如何排查CPU佔用過高以及常見的幾種情況

如何排查CPU佔用過高以及常見的幾種情況

在最近上線過程中遇到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 問題,現階段還沒遇到,遇到了再補充....