命令 jstack 查看线程使用情况

简介

jstack 常用来打印 Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的集合。

主要用来定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待。

语法

1
2
3
4
5
6
7
8
jstack [ options ] pid                                      //Java进程
jstack [ options ] executable core //core文件
jstack [ options ] [ server-id@ ] remote-hostname-or-IP //远程调试端口

Options
-F 强制dump线程堆栈信息. 用于进程hung住, jstack <pid>命令没有响应的情况
-m 同时打印java和本地(native)线程栈信息,m是mixed mode的简写
-l 打印锁的额外信息

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@node01 bin]# jstack 2203
Full thread dump Java HotSpot(TM) 64‐Bit Server VM (25.141‐b15 mixed mode):
"Attach Listener" #24 daemon prio=9 os_prio=0 tid=0x00007fabb4001000 nid=0x906 waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"pool-1-thread-3" #12 prio=5 os_prio=0 tid=0x00007fc99412f000 nid=0x9bc in Object.wait() [0x00007fc97c2f2000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000000d7017420> (a com.liang.java.thinkinginjava.concurency.waxomatic.Car)
at java.lang.Object.wait(Object.java:502)
at com.liang.java.thinkinginjava.concurency.waxomatic.Car.waitForBuffing(WaxOMatic.java:47)
- locked <0x00000000d7017420> (a com.liang.java.thinkinginjava.concurency.waxomatic.Car)
at com.liang.java.thinkinginjava.concurency.waxomatic.WaxOn.run(WaxOMatic.java:61)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Locked ownable synchronizers:
- <0x00000000d729cdb0> (a java.util.concurrent.ThreadPoolExecutor$Worker)
  • "pool-1-thread-3" 是线程名称
  • prio=5 是该线程JVM中的优先级
  • os_prio=0 是该线程在OS中的优先级,由于并不是所有的操作系统都支持线程优先级,所以可能会出现都置为0的情况
  • tid=0x00007fc99412f000 是 JVM 内的 thread id (Java-level thread ID)
  • nid=0x9bc 是这个线程对应的操作系统本地线程id,每一个java线程都有一个对应的操作系统线程

关于死锁

在 JAVA 5中加强了对死锁的检测。线程 Dump 中可以直接报告出 Java 级别的死锁,如下所示:

1
2
3
4
5
6
7
8
9
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x0003f334 (object 0x22c19f18, a java.lang.Object),
which is held by "Thread-0"

"Thread-0":
waiting to lock monitor 0x0003f314 (object 0x22c19f20, a java.lang.Object),
which is held by "Thread-1"

命令 jstack 查看线程使用情况
https://flepeng.github.io/021-Java-42-JVM-命令-jstack-查看线程使用情况/
作者
Lepeng
发布于
2024年4月19日
许可协议