Linux Bash腳本打印出JVM進程中CPU消耗最高的線程信息

腳本內容 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章