Linux-JVM线程查询

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 个字符
相关推荐
分支预测失败2 小时前
RISC-V 核间中断 IPI 实战:从 MSIP 寄存器到 IMSIC 消息投递
linux·后端
GeW3 小时前
RHCE考试避坑指南"90%考生容易忽略的细节
linux
键盘会跳舞4 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
拂拉氏4 小时前
【知识讲解】 Linux环境变量的认识与使用
linux·环境变量
zhangrelay5 小时前
答疑-是否软件源问题都必须更换为国内呢-
linux·笔记·学习·ubuntu·ros2
zhangrelay5 小时前
《ROS 机器人程序设计》课程教学大纲-2026- kinetic-lyrical
linux·笔记·学习·ubuntu·机器人
KFCgrandpahhh5 小时前
rk3576点灯
linux·驱动开发
拂拉氏5 小时前
【知识讲解】 Linux进程认识及深度理解
linux·进程
码农小韩5 小时前
Linux应用开发(一)——Linux的标准IO
linux·运维·服务器
路弥行至5 小时前
Linux (ARM64 / Jetson) 挂载 exFAT 移动硬盘排障与离线安装指南
linux·运维·服务器·经验分享·笔记·jetson·exfat