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 个字符
相关推荐
民乐团扒谱机1 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
물の韜2 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
qq_371802112 小时前
Ubuntu Linux中安装WorkBuddy
linux·运维·服务器·ubuntu
无足鸟ICT2 小时前
【RHCA+】iptraf-ng(网络监控分析)
linux·网络
独隅2 小时前
WebStorm 在 Linux 环境下的实战安装与高效开发指南
linux·ide·webstorm
坤坤子吖4 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
阡陌数智4 小时前
Claude API新版本重大变更与安全升级指南
java·linux·安全
奶茶树5 小时前
【Linux】环境开发工具(vim,gcc,g++,Makefile)
linux·运维·vim
木子欢儿8 小时前
国内 macOS/Linux 安装 rust
linux·运维·服务器·macos·rust
say_fall8 小时前
【Linux网络编程】计算机网络基础:局域网与广域网、OSI七层模型与TCP/IP五层模型、封装解包与MAC/IP地址、端口号与socket编程接口
linux·网络·tcp/ip·计算机网络·信息与通信