jstack命令 详解

jstack命令 详解1 介绍 jstack 用于打印出给定的 java 进程 ID 或 core nbsp file 或远程调试服务的 Java 堆栈信息 如果是在 64 位机器上 需要指定选项 J d64 Windows 的 jstack 使用方式只支持以下的这种方式 jstack nbsp l nbsp pid 如果 java 程序崩溃生成 core 文件 jstack 工具可以用来获得 core 文件的 java nbsp stack 和 native nbsp stack 的信

1、介绍

jstack用于打印出给定的java进程IDcore file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项“-J-d64”Windowsjstack使用方式只支持以下的这种方式:

jstack [-l] pid

果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative stack的信息如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

2、命令格式

jstack [ option ] pid



jstack [ option ] executable core



jstack [ option ] [server-id@]remote-hostname-or-IP

3、常用参数说明

1)、options 

executable Java executable from which the core dump was produced.

(可能是产生core dumpjava可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务 

2)、基本参数:

-F’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表打印关于锁的附加信息,例如属于java.util.concurrentownable synchronizers列表.

-m打印javanative c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

4、jstack分析线程死锁



线程死锁的代码如下。


  1. public class ThreadDeadLockDemo {  
  2.   
  3.     public static void main(String[] args) {  
  4.         final Object obj_1 = new Object(), obj_2 = new Object();  
  5.           
  6.         Thread first = new Thread(“first”){  
  7.             @Override  
  8.             public void run() {  
  9.                 synchronized (obj_1) {  
  10.                     try {  
  11.                         Thread.sleep(3000);  
  12.                     } catch (InterruptedException e) {}  
  13.                       
  14.                     synchronized (obj_2) {  
  15.                         System.out.println(“first thread done.”);  
  16.                     }  
  17.                 }  
  18.             }  
  19.         };  
  20.           
  21.         Thread second = new Thread(“second”){  
  22.             @Override  
  23.             public void run() {  
  24.                 synchronized (obj_2) {  
  25.                     try {  
  26.                         Thread.sleep(3000);  
  27.                     } catch (InterruptedException e) {}  
  28.                       
  29.                     synchronized (obj_1) {  
  30.                         System.out.println(“seconde thread done.”);  
  31.                     }  
  32.                 }  
  33.             }  
  34.         };  
  35.           
  36.         first.start();  
  37.         second.start();  
  38.     }  
  39.       
  40. }  
执行程序,会引起线程死锁。
调用 jstack命令,查看当前进程的线程状态,打印信息如下。可以发现进程已经发生了死锁,first线程等待second线程释放资源,同时,second线程也在等待first线程释放资源。


Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.45-b01 mixed mode):

“Attach Listener” daemon prio=10 tid=0x00007f87d0001000 nid=0x7c1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“DestroyJavaVM” prio=10 tid=0x00007f87fc005800 nid=0x793 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“second” prio=10 tid=0x00007f87fc0aa800 nid=0x7a1 waiting for monitor entry [0x00007f87fa5c1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        – locked <0x00000007d7036b50> (a java.lang.Object)

“first” prio=10 tid=0x00007f87fc0a8800 nid=0x7a0 waiting for monitor entry [0x00007f87fa6c2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        – locked <0x00000007d7036b40> (a java.lang.Object)

“Low Memory Detector” daemon prio=10 tid=0x00007f87fc08f800 nid=0x79e runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“C2 CompilerThread1” daemon prio=10 tid=0x00007f87fc08d800 nid=0x79d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“C2 CompilerThread0” daemon prio=10 tid=0x00007f87fc08a800 nid=0x79c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“Signal Dispatcher” daemon prio=10 tid=0x00007f87fc088800 nid=0x79b runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“Finalizer” daemon prio=10 tid=0x00007f87fc06c000 nid=0x79a in Object.wait() [0x00007f87facc8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x00000007d> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        – locked <0x00000007d> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

“Reference Handler” daemon prio=10 tid=0x00007f87fc06a000 nid=0x799 in Object.wait() [0x00007f87fadc9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        – locked <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)

“VM Thread” prio=10 tid=0x00007f87fc063800 nid=0x798 runnable 

“GC task thread#0 (ParallelGC)” prio=10 tid=0x00007f87fc019000 nid=0x794 runnable 

“GC task thread#1 (ParallelGC)” prio=10 tid=0x00007f87fc01a800 nid=0x795 runnable 

“GC task thread#2 (ParallelGC)” prio=10 tid=0x00007f87fc01c800 nid=0x796 runnable 

“GC task thread#3 (ParallelGC)” prio=10 tid=0x00007f87fc01e800 nid=0x797 runnable 

“VM Periodic Task Thread” prio=10 tid=0x00007f87fc09a800 nid=0x79f waiting on condition 

JNI global references: 882

Found one Java-level deadlock:
=============================
“second”:
  waiting to lock monitor 0x00007f87dc005f10 (object 0x00000007d7036b40, a java.lang.Object),
  which is held by “first”
“first”:
  waiting to lock monitor 0x00007f87dc004b60 (object 0x00000007d7036b50, a java.lang.Object),
  which is held by “second”

Java stack information for the threads listed above:
===================================================
“second”:
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        – locked <0x00000007d7036b50> (a java.lang.Object)
“first”:
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        – locked <0x00000007d7036b40> (a java.lang.Object)

Found 1 deadlock.

“Attach Listener” daemon prio=10 tid=0x00007f87d0001000 nid=0x7c1 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“DestroyJavaVM” prio=10 tid=0x00007f87fc005800 nid=0x793 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“second” prio=10 tid=0x00007f87fc0aa800 nid=0x7a1 waiting for monitor entry [0x00007f87fa5c1000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        – locked <0x00000007d7036b50> (a java.lang.Object)

“first” prio=10 tid=0x00007f87fc0a8800 nid=0x7a0 waiting for monitor entry [0x00007f87fa6c2000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        – locked <0x00000007d7036b40> (a java.lang.Object)

“Low Memory Detector” daemon prio=10 tid=0x00007f87fc08f800 nid=0x79e runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“C2 CompilerThread1” daemon prio=10 tid=0x00007f87fc08d800 nid=0x79d waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“C2 CompilerThread0” daemon prio=10 tid=0x00007f87fc08a800 nid=0x79c waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“Signal Dispatcher” daemon prio=10 tid=0x00007f87fc088800 nid=0x79b runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

“Finalizer” daemon prio=10 tid=0x00007f87fc06c000 nid=0x79a in Object.wait() [0x00007f87facc8000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x00000007d> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        – locked <0x00000007d> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

“Reference Handler” daemon prio=10 tid=0x00007f87fc06a000 nid=0x799 in Object.wait() [0x00007f87fadc9000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        – waiting on <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)
        at java.lang.Object.wait(Object.java:485)
        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
        – locked <0x00000007d70011d8> (a java.lang.ref.Reference$Lock)

“VM Thread” prio=10 tid=0x00007f87fc063800 nid=0x798 runnable 

“GC task thread#0 (ParallelGC)” prio=10 tid=0x00007f87fc019000 nid=0x794 runnable 

“GC task thread#1 (ParallelGC)” prio=10 tid=0x00007f87fc01a800 nid=0x795 runnable 

“GC task thread#2 (ParallelGC)” prio=10 tid=0x00007f87fc01c800 nid=0x796 runnable 

“GC task thread#3 (ParallelGC)” prio=10 tid=0x00007f87fc01e800 nid=0x797 runnable 

“VM Periodic Task Thread” prio=10 tid=0x00007f87fc09a800 nid=0x79f waiting on condition 

JNI global references: 882

Found one Java-level deadlock:
=============================
“second”:
  waiting to lock monitor 0x00007f87dc005f10 (object 0x00000007d7036b40, a java.lang.Object),
  which is held by “first”
“first”:
  waiting to lock monitor 0x00007f87dc004b60 (object 0x00000007d7036b50, a java.lang.Object),
  which is held by “second”

Java stack information for the threads listed above:
===================================================
“second”:
        at ThreadDeadLockDemo$2.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b40> (a java.lang.Object)
        – locked <0x00000007d7036b50> (a java.lang.Object)
“first”:
        at ThreadDeadLockDemo$1.run(ThreadDeadLockDemo.java:10)
        – waiting to lock <0x00000007d7036b50> (a java.lang.Object)
        – locked <0x00000007d7036b40> (a java.lang.Object)

Found 1 deadlock.




















































































































































































































版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202474.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午7:03
下一篇 2026年3月20日 上午7:03


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号