首頁歷史 > 正文

java之CPU過高排查

2022-02-22由 閒著沒事聊會 發表于 歷史

1。引子

有一次線上CPU過高,在這裡簡單記錄一下排查的步驟。在這裡。先模擬一個java應用CPU過高的程式。一般CPU過高,可能是程式碼中有死迴圈導致。

2。模擬

啟動一個執行緒,寫一個死迴圈,這個簡單:

public class Test { public static void main(String[] args) { if (args。length == 0) { System。out。println(“執行的時候請輸入參:1 or 2”); return; } if (args[0]。equalsIgnoreCase(“1”)) { startThread1(); } if (args[0]。equalsIgnoreCase(“2”)) { startThread2(); } } public static void startThread1() { Thread thread = new Thread(new Runnable() { @Override public void run() { while (true) { String a = new String(“deadThread”); } } }); thread。setName(“deadThread”); thread。start(); } public static void startThread2() { Thread thread = new Thread(new Runnable() { @Override public void run() { List list = new ArrayList<>(); while (true) { String a = new String(“OOMThread”); try { Thread。sleep(10); } catch (InterruptedException e) { e。printStackTrace(); } list。add(a); } } }); thread。setName(“OOMThread”); thread。start(); }}

上面程式很簡單,輸入引數1,表示啟動一個執行緒。迴圈輸出一個字串。

3。上機測試

首先編譯一下:

javac test。java

java之CPU過高排查

javac test。java

然後執行該程式:

java Test 1

java之CPU過高排查

java Test 1

4排查問題

1首先,使用top命令看一下那個程序CPU過高

java之CPU過高排查

top

2.記錄一下pid號

:64644,然後Ctrl+C,停止。輸入:top -H -p 64644

java之CPU過高排查

top -H -p 64644

這樣到java程序中那個執行緒導致的CPU過高。拿到PID:64659。

由於java棧中顯示的pid是16進位制的。所以這裡需要將十進位制轉化為16進位制:

printf ‘%x\n’ 64659

java之CPU過高排查

printf ‘%x\n’ 64659

3.使用jstack命令檢視

jstack 64644

java之CPU過高排查

敲完之後,會顯示很多內容,這個時候就用到了,剛才將十進位制轉化為16進位制的:fc93了,使用grep過濾一下

java之CPU過高排查

jstack 64644 | grep -A10 fc93

注:這-A10表示搜尋到fc93的地方,向下多展示10行。如下圖。

java之CPU過高排查

到此,就找到了導致CPU過高的程式碼。at Test$1。run(test。java:31)。然後去檢查自己的程式碼。

5。後續

記錄一下,排查問題的步驟。下次介紹一下,OOM的排查。

頂部