jstack 621 | grep 'tid.*nid' | awk -F '"' '{print $2}' | cut -d - -f 1 | cut -d# -f 1 | sort | uniq -c | sort -k1 -nr
1、jps 查看java 进程id
powershell
68890 Jps
621 Boot
2、jstack 621
powershell
jstack 621:抓取 PID=621 的 Java 进程线程栈快照
默认格式如下:jstack 输出中每线程首行,格式如 "xxx-Thread-N" tid=0x.. nid=0x..
"Log4j2-TF-1-AsyncLoggerConfig-1" #27 daemon prio=5 os_prio=0 cpu=81206.85ms elapsed=38402.93s tid=0x00007fd6fdc9f8a0 nid=0x370 runnable [0x00007fd4ae26a000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.3/Native Method)
- parking to wait for <0x0000100331567b98> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.3/LockSupport.java:252)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(java.base@17.0.3/AbstractQueuedSynchronizer.java:1672)
at com.lmax.disruptor.TimeoutBlockingWaitStrategy.waitFor(TimeoutBlockingWaitStrategy.java:38)
at com.lmax.disruptor.ProcessingSequenceBarrier.waitFor(ProcessingSequenceBarrier.java:56)
at com.lmax.disruptor.BatchEventProcessor.processEvents(BatchEventProcessor.java:159)
at com.lmax.disruptor.BatchEventProcessor.run(BatchEventProcessor.java:125)
at java.lang.Thread.run(java.base@17.0.3/Thread.java:833)
"XMDFileAppender-xmdZebraAppender" #35 daemon prio=5 os_prio=0 cpu=0.14ms elapsed=38402.90s tid=0x00007fd6fddaa300 nid=0x378 waiting on condition [0x00007fd4ad5fa000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.3/Native Method)
- parking to wait for <0x00001000144db120> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@17.0.3/LockSupport.java:341)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@17.0.3/AbstractQueuedSynchronizer.java:506)
at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@17.0.3/ForkJoinPool.java:3463)
at java.util.concurrent.ForkJoinPool.managedBlock(java.base@17.0.3/ForkJoinPool.java:3434)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17.0.3/AbstractQueuedSynchronizer.java:1623)
at java.util.concurrent.ArrayBlockingQueue.take(java.base@17.0.3/ArrayBlockingQueue.java:420)
at com.meituan.inf.xmdlog.XMDFileAppender$AsyncThread.run(XMDFileAppender.java:515)
"lion-PollWorker-nodeCheck--thread-1" #78 daemon prio=5 os_prio=0 cpu=1341.85ms elapsed=38401.28s tid=0x00007fd6fe3ad5e0 nid=0x3c3 waiting on condition [0x00007fd3c4a73000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@17.0.3/Native Method)
at com.dianping.lion.client.http.AbstractPollWorker$NodeHealthCheckTask.run(AbstractPollWorker.java:453)
at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.3/Executors.java:539)
at java.util.concurrent.FutureTask.run(java.base@17.0.3/FutureTask.java:264)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.3/ThreadPoolExecutor.java:1136)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.3/ThreadPoolExecutor.java:635)
at java.lang.Thread.run(java.base@17.0.3/Thread.java:833)
3、grep 'tid.*nid'
powershell
过滤出包含线程 ID 的行(jstack 输出中每线程首行,格式如 "xxx-Thread-N" tid=0x.. nid=0x..)
4、awk -F '"' '{print $2}'
powershell
以双引号为分隔符,提取第2字段 → 线程名
因为包含tid.*nid行内容如下
"Log4j2-TF-1-AsyncLoggerConfig-1" #27 daemon prio=5 os_prio=0 cpu=81206.85ms elapsed=38402.93s tid=0x00007fd6fdc9f8a0 nid=0x370 runnable [0x00007fd4ae26a000]
以'"' 为分割符(-F:指定分隔符)
5、cut -d - -f 1 | cut -d# -f 1
powershell
以 - 为分隔符,取第1段
cut -d - -f 1 与awk -F '-' '{print $1区别}'
1、awk分隔符可以是字符串,cut分隔符必须是单字符
例:
echo "a::b" | awk -F'::' '{print $1}' # 输出: a
echo "a::b" | cut -d'::' -f1 # 报错:分隔符必须是单字符
2、awk支持正则,cut不支持
3、awk同时做其他处理:
例:awk -F- '{print $1, NF}' # 输出第1字段 + 字段总数
4、cut 更轻量
在本任务中两者输出内容一致
6、sort :排序
powershell
sort
-n:按数值排序(10、2、3、1不加n,排序结果:1、10、2、3,加n排序结果:1、2、3、10)
-r:倒序
-k:按指定列排序(如:sort -k1 file:按第一列排序, sort -k1 -k2 -nr file:先按第1列升序,第1列相同再按第2列降序)
-t:指定分隔符
-u:去重
-f:忽略大小写
-v:版本号排序
7、uniq -c
powershell
相邻相同行合并并计数:uniq 只合并连续相同的行,必须先 sort!
uniq
-c:在行首显示出现次数
-d:只显示重复的行
-u:只显示未重复的行
-i:忽略大小写
-w N:只比较前 N 个字符