#!/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
#!/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/