java之CPU過高排查
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
上面程式很簡單,輸入引數1,表示啟動一個執行緒。迴圈輸出一個字串。
3。上機測試
首先編譯一下:
javac test。java
javac test。java
然後執行該程式:
java Test 1
java Test 1
4排查問題
1首先,使用top命令看一下那個程序CPU過高
top
2.記錄一下pid號
:64644,然後Ctrl+C,停止。輸入:top -H -p 64644
top -H -p 64644
這樣到java程序中那個執行緒導致的CPU過高。拿到PID:64659。
由於java棧中顯示的pid是16進位制的。所以這裡需要將十進位制轉化為16進位制:
printf ‘%x\n’ 64659
printf ‘%x\n’ 64659
3.使用jstack命令檢視
jstack 64644
敲完之後,會顯示很多內容,這個時候就用到了,剛才將十進位制轉化為16進位制的:fc93了,使用grep過濾一下
jstack 64644 | grep -A10 fc93
注:這-A10表示搜尋到fc93的地方,向下多展示10行。如下圖。
到此,就找到了導致CPU過高的程式碼。at Test$1。run(test。java:31)。然後去檢查自己的程式碼。
5。後續
記錄一下,排查問題的步驟。下次介紹一下,OOM的排查。