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 个字符
相关推荐
Super 含1 小时前
Android 启动优化(三):Perfetto 实战——启动时间到底花在哪里?
jvm·算法
blueSatchel2 小时前
u-boot启动过程(bootROM到SPL到u-boot)
linux·u-boot
祖力552 小时前
快速学会数据结构中的链式队列与循环队列
linux·c语言·数据结构·算法
原凉是这样的丶2 小时前
Qwen3.8-27B 开源后,我用双 RTX 4090 跑通了:vLLM 0.27.1、128K 上下文与 MTP 实测
linux·算法
会编程的吕洞宾2 小时前
Full GC频繁接口卡顿?JVM排查到调优实战
jvm
不会就选b3 小时前
Linux之线程进阶(一)
jvm
北京迅为3 小时前
【迅为开发板专属工具】把烧写入口放进浏览器|Topeet RK Flash
linux·人工智能·嵌入式·rk3568·烧写
xiebingsuccess3 小时前
Ubuntu 22.04 在 VMware 上的安装与远程桌面配置 — 任务报告
linux·运维·ubuntu·ai+嵌入式开发