jstack命令 详解

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 <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x00000007d7001300> (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 <0x00000007d7001300> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
        - locked <0x00000007d7001300> (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.

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jstack命令是JDK中的一个工具,用于打印正在运行的Java进程的线程栈信息。它可以通过以下几种方式使用: 1. 使用jstack命令连接到正在运行的进程,通过指定进程ID来获取线程栈信息。例如,可以使用以下命令查看进程ID为19332的线程堆栈信息: jstack 19332 2. 使用jstack命令连接到已挂起的进程,通过指定进程ID来获取线程栈信息。在某些情况下,jstack命令可能没有响应,可以使用选项"-F"来强制打印线程栈信息。例如,可以使用以下命令查看进程ID为19332的已挂起进程的线程堆栈信息: jstack -F 19332 3. 使用jstack命令连接到核心文件(core file),通过指定可执行文件和核心文件的路径来获取线程栈信息。例如,可以使用以下命令查看可执行文件和核心文件的路径为"executable"和"core"的线程堆栈信息: jstack executable core 除了以上用法外,jstack命令还支持一些选项来获取更详细的信息。例如,选项"-m"可以打印Java栈和本地方法栈,选项"-l"可以打印关于锁的额外信息。 总结来说,jstack命令是JVM自带的Java堆栈跟踪工具,用于生成当前时刻的线程快照,以定位线程出现长时间停顿的原因。它还可以用于获取core文件的Java堆栈和本地方法栈信息,或者附属到正在运行的Java程序中查看实时的线程堆栈信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [jstack 命令解读](https://blog.csdn.net/qq_19922839/article/details/115379649)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [jstack命令解析](https://blog.csdn.net/weixin_44588186/article/details/124680586)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值