以下方法仅适用于Linux,不适用于MacOS。
通过top工具查看CPU使用率较高的进程号,再通过以下命令列出该进程下的线程。
top -Hp <pid>
通过jstack工具查看该进程的堆栈快照。
jstack <pid>
会得到下面这样的结果。
"Thread-0" #8 prio=5 os_prio=0 tid=0x00007f85dc1cd800 nid=0x7c29 runnable [0x00007f85c9924000]
java.lang.Thread.State: RUNNABLE
at Main.lambda$main$0(Main.java:5)
at Main$$Lambda$1/250421012.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
由于jstack输出的线程号是16进制,因此我们需要把从top工具中找出的线程号转换成16进制。
printf "%x\n" <tid>
这样就得到了16进制的线程号,此时再去jstack的输出结果根据线程号(nid)查找堆栈信息即可。