JVM jstack工具介绍举例说明用法

jstack是JVM自带的命令行工具,用于生成当前JVM的线程快照(也称为线程转储)。它可以提供有关JVM中各个线程的有用信息,如线程状态、调用堆栈、持有的锁以及与死锁相关的信息。

jstack命令可以从多个角度查看线程快照,最常用的用法是将输出直接发送到控制台,例如:

jstack <pid>

其中是目标JVM进程的进程ID。执行该命令后,jstack将打印有关每个线程的信息,包括线程ID、线程名称、线程状态和调用堆栈信息。以下是一个示例输出:

"main" #1 prio=5 os_prio=0 tid=0x00007f8c8011d800 nid=0x10df waiting on condition [0x00007f8c874b5000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at Test.main(Test.java:6)

"Thread-0" #2 prio=5 os_prio=0 tid=0x00007f8c8011e800 nid=0x10e0 waiting on condition [0x00007f8c86eb7000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at Test$1.run(Test.java:12)
        at java.lang.Thread.run(Thread.java:745)

"Attach Listener" #3 daemon prio=9 os_prio=0 tid=0x00007f8c80152800 nid=0x10e1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

每个线程的输出都以其名称开头,并包含线程ID、线程优先级、操作系统优先级、线程ID(在Java中称为“nid”)、线程状态和可能存在的锁信息。在这个例子中,我们可以看到JVM进程中有三个线程,“main”线程处于TIMED_WAITING状态,等待一个条件,而“Thread-0”线程也处于TIMED_WAITING状态,等待另一个条件。第三个线程是“Attach Listener”,是一个后台线程,处于可运行状态。

jstack还支持许多其他选项,例如可以输出死锁信息、安全地中断线程等。此外,jstack可以与其他JVM工具一起使用,如jmap和jstat,以提供更全面的诊断和分析功能。