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 个字符
相关推荐
ShineWinsu7 小时前
对于ProtoBuffer:ProtoBuffer的介绍以及安装
linux·网络·google·协议·序列化·反序列化·protobuffer
FlightYe7 小时前
视界原理之2D视频(二):视频文件里有什么
android·linux·网络·c++·ffmpeg·音视频·aac
GeW9 小时前
从代码到共识:技术突围如何映照大国相处之道
linux
承渊政道9 小时前
Linux系统学习【进程信号详细解析——认识、产生、保存以及捕捉信号】
linux·学习·ubuntu·ssh·vs code·进程信号
硅基手札10 小时前
【linux内核专栏01】Linux 内核心智模型与设计哲学
linux·运维·驱动开发·开源软件
码完就睡10 小时前
Linux——socket网络编程
linux·运维·网络
道尔柯南10 小时前
【Linux】网络基础概念
linux·运维·网络
jingli910 小时前
一个测试用例把连接池卡死 30 秒:SQLite 连接池 max_size=1 下的重入自锁复盘
jvm·sqlite·测试用例
傲世仙尊10 小时前
从抢票事故到锁的原理-互斥条件变量与生产消费模型
linux·驱动开发
AI+程序员在路上10 小时前
AP6275S蓝牙双接口解析:HCI UART与PCM的分工与协同
linux·c语言·物联网