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__` -A5

测试

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

脚本printTop1JvmThread-F.sh

#!/bin/bash
 
 
top -Hbp $1 -n 1 | grep PID -A1 | grep -v PID | awk '{print $1}' | xargs -i echo {} > /tmp/__tmp_thread_id__ && jstack -F $1 | grep `cat /tmp/__tmp_thread_id__` -A5

效果top -Hp 32303

Threads:  44 total,   1 running,  43 sleeping,   0 stopped,   0 zombie
%Cpu(s): 17.2 us,  0.3 sy,  0.0 ni, 82.2 id,  0.0 wa,  0.2 hi,  0.1 si,  0.0 st
MiB Mem :  32052.9 total,  18993.5 free,   8247.3 used,   4812.1 buff/cache
MiB Swap:  12848.0 total,  12848.0 free,      0.0 used.  23193.9 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                        
  32339 yeqiang   20   0   12.7g   2.8g  20112 R  99.7   9.0  49:28.71 hknaruto                                                       
  32321 yeqiang   20   0   12.7g   2.8g  20112 S   0.3   9.0   0:01.62 VM Thread                                                      
  32303 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.00 java                                                           
  32306 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.09 java                                                           
  32312 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.62 java                                                           
  32313 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.61 java                                                           
  32314 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.61 java                                                           
  32315 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.61 java                                                           
  32316 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.61 java                                                           
  32317 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.60 java                                                           
  32322 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.01 Reference Handl                                                
  32323 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.02 Finalizer                                                      
  32332 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.00 Signal Dispatch                                                
  32333 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.00 Monitor Ctrl-Br                                                
  32334 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:06.38 C2 CompilerThre                                                
  32335 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:07.03 C2 CompilerThre                                                
  32336 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:01.47 C1 CompilerThre                                                
  32337 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.00 Service Thread                                                 
  32338 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.44 VM Periodic Tas                                                
  32359 yeqiang   20   0   12.7g   2.8g  20112 S   0.0   9.0   0:00.00 Attach Listener   
yeqiang@localhost bash_script]$ sh printTop1JvmThread-F.sh 32303
Thread 32339: (state = IN_JAVA)
 - com.example.demo.DemoApplication$1.run() @bci=32, line=20 (Compiled frame; information may be imprecise)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)


说明:

jstack -F参数获取的信息,不会有nid信息显示,其中的额Thread 32339与top -Hp中打印的PID一致,不用转换!

更好的监控工具可以参考:https://alibaba.github.io/arthas/

猜你喜欢

转载自blog.csdn.net/hknaruto/article/details/106057335