JVM常见命令之jstack

一、介绍:jstack用于生成虚拟机指定进程当前时刻的线程快照,虚拟机堆栈追踪,线程快照就是当前虚拟机内指定进程的每一条线程正在执行方法堆栈的集合

二、作用:可用于定位线程长时间停顿的原因,如线程死锁,死循环,线程请求外部资源导致长时间等待,这些都是线程长时间等待的原因,当线程长时间等待时,就可以使用jstack来查看线程调用堆栈的情况

三、重点关注:   

  1. DeadLock 死锁
  2. waiting on condition 资源等待
  3.  wait on monitor entry 等待获取监控器
  4. Blocked 阻塞
  5. Runnable 执行中
  6. Suspended  暂停 
  7. Object wait 对象等待 

四、使用

1、jstack -help

  • -F 当正常输出的线程不被响应时,强制输出线程堆栈
  • -m 如果调用本地方法的话,显示c/c++的堆栈信息
  • -l 出堆栈外,显示关于锁的附加信息
  • -h 帮助操作

2、jstack -pid 

jstackTest两个线程模拟死锁情况查看jstack打印的内容

执行命令:jstack 64684 >d:\jstackTest.txt 

jstackTest.txt 文件内容如下:

2022-03-23 19:44:20
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.121-b13 mixed mode):

"DestroyJavaVM" #15 prio=5 os_prio=0 tid=0x0000000003423800 nid=0x10818 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Thread-2" #14 prio=5 os_prio=0 tid=0x0000000018920000 nid=0x103ac waiting for monitor entry [0x0000000019a0f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at com.coolcollege.circle.CircleTest.lambda$main$2(CircleTest.java:66)
	- waiting to lock <0x000000076c50ffc0> (a java.lang.StringBuilder)
	- locked <0x000000076c510008> (a java.lang.StringBuilder)
	at com.coolcollege.circle.CircleTest$$Lambda$3/1709537756.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:745)

"Thread-1" #13 prio=5 os_prio=0 tid=0x000000001891f800 nid=0x10eb0 waiting for monitor entry [0x000000001990f000]
   java.lang.Thread.State: BLOCKED (on object monitor)
	at com.coolcollege.circle.CircleTest.lambda$main$1(CircleTest.java:52)
	- waiting to lock <0x000000076c510008> (a java.lang.StringBuilder)
	- locked <0x000000076c50ffc0> (a java.lang.StringBuilder)
	at com.coolcollege.circle.CircleTest$$Lambda$2/1612799726.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:745)

"Service Thread" #11 daemon prio=9 os_prio=0 tid=0x0000000017f7a000 nid=0xe358 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x0000000017eca800 nid=0x10258 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x0000000017ec9800 nid=0xc774 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x0000000017ec7000 nid=0xd3bc waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x0000000017ec6000 nid=0xc690 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x0000000017ec2800 nid=0x870 runnable [0x00000000180ee000]
   java.lang.Thread.State: RUNNABLE
	at java.net.SocketInputStream.socketRead0(Native Method)
	at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
	at java.net.SocketInputStream.read(SocketInputStream.java:171)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
	at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
	at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
	- locked <0x000000076c21b688> (a java.io.InputStreamReader)
	at java.io.InputStreamReader.read(InputStreamReader.java:184)
	at java.io.BufferedReader.fill(BufferedReader.java:161)
	at java.io.BufferedReader.readLine(BufferedReader.java:324)
	- locked <0x000000076c21b688> (a java.io.InputStreamReader)
	at java.io.BufferedReader.readLine(BufferedReader.java:389)
	at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)

"Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000000001718a000 nid=0x10340 waiting on condition [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000000017187800 nid=0x111f8 runnable [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000000017110800 nid=0x1113c in Object.wait() [0x00000000175ef000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x000000076bb88ec8> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
	- locked <0x000000076bb88ec8> (a java.lang.ref.ReferenceQueue$Lock)
	at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
	at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

"Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x00000000151ff800 nid=0xf940 in Object.wait() [0x00000000170ee000]
   java.lang.Thread.State: WAITING (on object monitor)
	at java.lang.Object.wait(Native Method)
	- waiting on <0x000000076bb86b68> (a java.lang.ref.Reference$Lock)
	at java.lang.Object.wait(Object.java:502)
	at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
	- locked <0x000000076bb86b68> (a java.lang.ref.Reference$Lock)
	at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

"VM Thread" os_prio=2 tid=0x00000000151f6800 nid=0x111fc runnable 

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000000003441800 nid=0x9868 runnable 

"GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000000003443000 nid=0x11390 runnable 

"GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000000003444800 nid=0x10070 runnable 

"GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000000003446000 nid=0x1003c runnable 

"GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000000003448000 nid=0x10adc runnable 

"GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000000003449800 nid=0x11354 runnable 

"GC task thread#6 (ParallelGC)" os_prio=0 tid=0x000000000344c800 nid=0x10508 runnable 

"GC task thread#7 (ParallelGC)" os_prio=0 tid=0x000000000344e800 nid=0x111f4 runnable 

"VM Periodic Task Thread" os_prio=2 tid=0x000000001863c000 nid=0xfee4 waiting on condition 

JNI global references: 333


Found one Java-level deadlock:
=============================
"Thread-2":
  waiting to lock monitor 0x0000000015203c08 (object 0x000000076c50ffc0, a java.lang.StringBuilder),
  which is held by "Thread-1"
"Thread-1":
  waiting to lock monitor 0x00000000152065f8 (object 0x000000076c510008, a java.lang.StringBuilder),
  which is held by "Thread-2"

Java stack information for the threads listed above:
===================================================
"Thread-2":
	at com.coolcollege.circle.CircleTest.lambda$main$2(CircleTest.java:66)
	- waiting to lock <0x000000076c50ffc0> (a java.lang.StringBuilder)
	- locked <0x000000076c510008> (a java.lang.StringBuilder)
	at com.coolcollege.circle.CircleTest$$Lambda$3/1709537756.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:745)
"Thread-1":
	at com.coolcollege.circle.CircleTest.lambda$main$1(CircleTest.java:52)
	- waiting to lock <0x000000076c510008> (a java.lang.StringBuilder)
	- locked <0x000000076c50ffc0> (a java.lang.StringBuilder)
	at com.coolcollege.circle.CircleTest$$Lambda$2/1612799726.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

 可以看出除了两个发生死锁的线程和系统的守护(dema)线程之外,其他线程都是属于执行状态。文件的最后也详细描述了出现死锁的线程和对应的代码信息。


版权声明:本文为qq_40012458原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。