腳本內容 printTop1JvmThread.sh
#!/bin/bash
top -Hbp $1 -n 1 | grep PID -A1 | grep -v PID | awk '{print $1}' | xargs -i printf %x {} > /tmp/__tmp_thread_id__ && jstack $1 | grep `cat /tmp/__tmp_thread_id__` -B5
測試
1. 編寫測試程序
package com.company;
import java.util.Random;
public class Main {
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("ccccccc");
while(true){
double a = new Random().nextDouble() / new Random().nextDouble();
}
}
}).start();
Thread.sleep(999999);
}
}
2. 運行程序,top查看進程id
3. 得到進程id號5065,執行打印腳本,打印出jvm內cpu消耗最高的線程信息
[yeqiang@localhost ~]$ sh printTop1JvmThread.sh 5065
Full thread dump OpenJDK 64-Bit Server VM (25.222-b10 mixed mode):
"Attach Listener" #11 daemon prio=9 os_prio=0 tid=0x00007fe744001000 nid=0x13ec waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
"ccccccc" #10 prio=5 os_prio=0 tid=0x00007fe78c22e800 nid=0x13e6 runnable [0x00007fe774b50000]
可以看到其中打印出來的進程名稱就是我們設置的ccccccc
更好的監控工具可以參考:https://alibaba.github.io/arthas/