一、基本情况

jstack(JVM Stack Trace):用于生成虚拟机指定进程当前时刻的线程快照(虚拟机堆栈跟踪)。线程快照就是当前虚拟机内指定进程的每一条线程正在执行的方法堆栈的集合。

生成线程快照的作用:可用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等问题。这些都是导致线程长时间停顿的常见原因。当线程出现停顿时,就可以用jstack显示各个线程调用的堆栈情况。

官方帮助文档:
https://docs.oracle.com/en/java/javase/11/tools/jstack.html

在thread dump中,要留意下面几种状态

  • 死锁,Deadlock(重点关注)
  • 等待资源,Waiting on condition(重点关注)
  • 等待获取监视器,Waiting on monitor entry(重点关注)
  • 阻塞,Blocked(重点关注)
  • 执行中,Runnable
  • 暂停,Suspended

    二、基本语法

    image.png
    它的基本使用语法为:
    jstack option pid

jstack管理远程进程的话,需要在远程程序的启动参数中增加:
-Djava.rmi.server.hostname=… . .
-Dcom.sun.management .jmxremote
-Dcom.sun .management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

2.1、举例

  1. package studies.jvm.jstack;
  2. /**
  3. * @Date: 2021/5/12
  4. * @Time: 13:22
  5. * @BelongsProject base
  6. * @BelongsPackage studies.jvm.jstack
  7. * 演示死锁问题
  8. */
  9. public class TreadDeadLock {
  10. public static void main(String[] args) {
  11. StringBuilder s1 = new StringBuilder();
  12. StringBuilder s2 = new StringBuilder();
  13. new Thread(() -> {
  14. synchronized (s1){
  15. s1.append("a");
  16. s2.append("1");
  17. try {
  18. Thread.sleep(100);
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. synchronized (s2){
  23. s1.append("b");
  24. s2.append("2");
  25. System.out.println("s1-1 "+s1);
  26. System.out.println("s2-1 "+s2);
  27. }
  28. }
  29. }).start();
  30. new Thread(new Runnable(){
  31. @Override
  32. public void run() {
  33. synchronized (s2){
  34. s1.append("c");
  35. s2.append("3");
  36. synchronized (s1){
  37. s1.append("d");
  38. s2.append("4");
  39. System.out.println("s1-2 "+s1);
  40. System.out.println("s2-2 "+s2);
  41. }
  42. }
  43. }
  44. }).start();
  45. }
  46. }

控制台输出

  1. C:\Users\dell>jps
  2. 2464
  3. 25616 Jps
  4. 27808 TreadDeadLock
  5. 4996 Launcher
  6. C:\Users\dell>jstack 27808
  7. 2021-05-12 14:00:03
  8. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.291-b10 mixed mode):
  9. "DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x000002b4f4569800 nid=0x74dc waiting on condition [0x0000000000000000]
  10. java.lang.Thread.State: RUNNABLE
  11. "Thread-1" #13 prio=5 os_prio=0 tid=0x000002b4fbd5b800 nid=0x2d88 waiting for monitor entry [0x000000e3297ff000]
  12. java.lang.Thread.State: BLOCKED (on object monitor)
  13. at studies.jvm.jstack.TreadDeadLock$1.run(TreadDeadLock.java:47)
  14. - waiting to lock <0x00000007167d7810> (a java.lang.StringBuilder)
  15. - locked <0x00000007167d7858> (a java.lang.StringBuilder)
  16. at java.lang.Thread.run(Thread.java:748)
  17. "Thread-0" #12 prio=5 os_prio=0 tid=0x000002b4fbd55000 nid=0x3f08 waiting for monitor entry [0x000000e3296fe000]
  18. java.lang.Thread.State: BLOCKED (on object monitor)
  19. at studies.jvm.jstack.TreadDeadLock.lambda$main$0(TreadDeadLock.java:28)
  20. - waiting to lock <0x00000007167d7858> (a java.lang.StringBuilder)
  21. - locked <0x00000007167d7810> (a java.lang.StringBuilder)
  22. at studies.jvm.jstack.TreadDeadLock$$Lambda$1/501263526.run(Unknown Source)
  23. at java.lang.Thread.run(Thread.java:748)
  24. "Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000002b4fbb0e000 nid=0x77fc runnable [0x0000000000000000]
  25. java.lang.Thread.State: RUNNABLE
  26. "C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000002b4fb9ef000 nid=0x15cc waiting on condition [0x0000000000000000]
  27. java.lang.Thread.State: RUNNABLE
  28. "C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000002b4fb9e2800 nid=0x908 waiting on condition [0x0000000000000000]
  29. java.lang.Thread.State: RUNNABLE
  30. "C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000002b4fb9df000 nid=0x60c4 waiting on condition [0x0000000000000000]
  31. java.lang.Thread.State: RUNNABLE
  32. "C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000002b4fb9de000 nid=0x53dc waiting on condition [0x0000000000000000]
  33. java.lang.Thread.State: RUNNABLE
  34. "Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000002b4fba80800 nid=0x7190 runnable [0x000000e328ffe000]
  35. java.lang.Thread.State: RUNNABLE
  36. at java.net.SocketInputStream.socketRead0(Native Method)
  37. at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
  38. at java.net.SocketInputStream.read(SocketInputStream.java:171)
  39. at java.net.SocketInputStream.read(SocketInputStream.java:141)
  40. at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
  41. at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
  42. at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  43. - locked <0x0000000716859f98> (a java.io.InputStreamReader)
  44. at java.io.InputStreamReader.read(InputStreamReader.java:184)
  45. at java.io.BufferedReader.fill(BufferedReader.java:161)
  46. at java.io.BufferedReader.readLine(BufferedReader.java:324)
  47. - locked <0x0000000716859f98> (a java.io.InputStreamReader)
  48. at java.io.BufferedReader.readLine(BufferedReader.java:389)
  49. at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)
  50. "Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000002b4f985c800 nid=0x7704 waiting on condition [0x0000000000000000]
  51. java.lang.Thread.State: RUNNABLE
  52. "Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000002b4f985b800 nid=0xd00 runnable [0x0000000000000000]
  53. java.lang.Thread.State: RUNNABLE
  54. "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000002b4f982d800 nid=0x16c8 in Object.wait() [0x000000e328cff000]
  55. java.lang.Thread.State: WAITING (on object monitor)
  56. at java.lang.Object.wait(Native Method)
  57. - waiting on <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  58. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  59. - locked <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  60. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  61. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
  62. "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000002b4f9825000 nid=0x6af4 in Object.wait() [0x000000e328bfe000]
  63. java.lang.Thread.State: WAITING (on object monitor)
  64. at java.lang.Object.wait(Native Method)
  65. - waiting on <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  66. at java.lang.Object.wait(Object.java:502)
  67. at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  68. - locked <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  69. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
  70. "VM Thread" os_prio=2 tid=0x000002b4f97fa000 nid=0xb24 runnable
  71. "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x000002b4f4580800 nid=0x5f88 runnable
  72. "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000002b4f4582000 nid=0x5b58 runnable
  73. "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000002b4f4583000 nid=0x1a68 runnable
  74. "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000002b4f4584800 nid=0x46d0 runnable
  75. "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x000002b4f4586800 nid=0x56e0 runnable
  76. "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x000002b4f4587800 nid=0x5894 runnable
  77. "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x000002b4f458b800 nid=0x76c4 runnable
  78. "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x000002b4f458c800 nid=0x6a20 runnable
  79. "VM Periodic Task Thread" os_prio=2 tid=0x000002b4fbb7a800 nid=0x5d0 waiting on condition
  80. JNI global references: 314
  81. Found one Java-level deadlock:
  82. =============================
  83. "Thread-1":
  84. waiting to lock monitor 0x000002b4f982ac28 (object 0x00000007167d7810, a java.lang.StringBuilder),
  85. which is held by "Thread-0"
  86. "Thread-0":
  87. waiting to lock monitor 0x000002b4f982c0c8 (object 0x00000007167d7858, a java.lang.StringBuilder),
  88. which is held by "Thread-1"
  89. Java stack information for the threads listed above:
  90. ===================================================
  91. "Thread-1":
  92. at studies.jvm.jstack.TreadDeadLock$1.run(TreadDeadLock.java:47)
  93. - waiting to lock <0x00000007167d7810> (a java.lang.StringBuilder)
  94. - locked <0x00000007167d7858> (a java.lang.StringBuilder)
  95. at java.lang.Thread.run(Thread.java:748)
  96. "Thread-0":
  97. at studies.jvm.jstack.TreadDeadLock.lambda$main$0(TreadDeadLock.java:28)
  98. - waiting to lock <0x00000007167d7858> (a java.lang.StringBuilder)
  99. - locked <0x00000007167d7810> (a java.lang.StringBuilder)
  100. at studies.jvm.jstack.TreadDeadLock$$Lambda$1/501263526.run(Unknown Source)
  101. at java.lang.Thread.run(Thread.java:748)
  102. Found 1 deadlock.
  103. C:\Users\dell>

很明显两个线程都处于上锁状态
image.png
可以看出两个线程相互持有锁的状态
image.png

例子2:

  1. package studies.jvm.jstack;
  2. /**
  3. * @Date: 2021/5/12
  4. * @Time: 19:13
  5. * @BelongsProject base
  6. * @BelongsPackage studies.jvm.jstack
  7. * 演示线程:TIMED_WAITING
  8. */
  9. public class TreadSleepTest {
  10. public static void main(String[] args) {
  11. System.out.println("hello - 1");
  12. try {
  13. Thread.sleep(1000 * 60 * 10);
  14. } catch (InterruptedException e) {
  15. e.printStackTrace();
  16. }
  17. System.out.println("hello - 2");
  18. }
  19. }

image.png
输出内容如下:

  1. 2021-05-12 19:17:22
  2. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.291-b10 mixed mode):
  3. "Service Thread" #11 daemon prio=9 os_prio=0 tid=0x0000020ed273f000 nid=0x67a8 runnable [0x0000000000000000]
  4. java.lang.Thread.State: RUNNABLE
  5. "C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x0000020ed2619800 nid=0x6710 waiting on condition [0x0000000000000000]
  6. java.lang.Thread.State: RUNNABLE
  7. "C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x0000020ed2614800 nid=0x6ca4 waiting on condition [0x0000000000000000]
  8. java.lang.Thread.State: RUNNABLE
  9. "C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x0000020ed260e000 nid=0x67c8 waiting on condition [0x0000000000000000]
  10. java.lang.Thread.State: RUNNABLE
  11. "C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x0000020ed26b5800 nid=0x6dcc waiting on condition [0x0000000000000000]
  12. java.lang.Thread.State: RUNNABLE
  13. "Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x0000020ed26b4000 nid=0x577c runnable [0x00000062905fe000]
  14. java.lang.Thread.State: RUNNABLE
  15. at java.net.SocketInputStream.socketRead0(Native Method)
  16. at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
  17. at java.net.SocketInputStream.read(SocketInputStream.java:171)
  18. at java.net.SocketInputStream.read(SocketInputStream.java:141)
  19. at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
  20. at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
  21. at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  22. - locked <0x0000000716859e90> (a java.io.InputStreamReader)
  23. at java.io.InputStreamReader.read(InputStreamReader.java:184)
  24. at java.io.BufferedReader.fill(BufferedReader.java:161)
  25. at java.io.BufferedReader.readLine(BufferedReader.java:324)
  26. - locked <0x0000000716859e90> (a java.io.InputStreamReader)
  27. at java.io.BufferedReader.readLine(BufferedReader.java:389)
  28. at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)
  29. "Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x0000020ed04be000 nid=0x4e04 waiting on condition [0x0000000000000000]
  30. java.lang.Thread.State: RUNNABLE
  31. "Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x0000020ed04bd800 nid=0x6b90 runnable [0x0000000000000000]
  32. java.lang.Thread.State: RUNNABLE
  33. "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x0000020ed048e800 nid=0x5b34 in Object.wait() [0x00000062902ff000]
  34. java.lang.Thread.State: WAITING (on object monitor)
  35. at java.lang.Object.wait(Native Method)
  36. - waiting on <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  37. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  38. - locked <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  39. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  40. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
  41. "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x0000020ed047f000 nid=0x4ec0 in Object.wait() [0x00000062901ff000]
  42. java.lang.Thread.State: WAITING (on object monitor)
  43. at java.lang.Object.wait(Native Method)
  44. - waiting on <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  45. at java.lang.Object.wait(Object.java:502)
  46. at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  47. - locked <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  48. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
  49. "main" #1 prio=5 os_prio=0 tid=0x0000020eac46a000 nid=0x3b2c waiting on condition [0x000000628f7ff000]
  50. java.lang.Thread.State: TIMED_WAITING (sleeping)
  51. at java.lang.Thread.sleep(Native Method)
  52. at studies.jvm.jstack.TreadSleepTest.main(TreadSleepTest.java:13)
  53. "VM Thread" os_prio=2 tid=0x0000020ed0455000 nid=0x43b0 runnable
  54. "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x0000020eac482000 nid=0x7134 runnable
  55. "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x0000020eac483800 nid=0x4b10 runnable
  56. "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x0000020eac484800 nid=0x5858 runnable
  57. "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x0000020eac486000 nid=0x5f94 runnable
  58. "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x0000020eac488000 nid=0x5490 runnable
  59. "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x0000020eac489000 nid=0x423c runnable
  60. "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x0000020eac48d000 nid=0x730c runnable
  61. "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x0000020eac48e000 nid=0x1b60 runnable
  62. "VM Periodic Task Thread" os_prio=2 tid=0x0000020ed263e800 nid=0x72cc waiting on condition
  63. JNI global references: 12

例子3:

  1. package studies.jvm.jstack;
  2. /**
  3. * @Date: 2021/5/12
  4. * @Time: 19:21
  5. * @BelongsProject base
  6. * @BelongsPackage studies.jvm.jstack
  7. * 演示线程同步的问题
  8. */
  9. public class ThreadSyncTest {
  10. public static void main(String[] args) {
  11. Number number = new Number();
  12. Thread t1 = new Thread(number);
  13. Thread t2 = new Thread(number);
  14. t1.setName("线程1");
  15. t2.setName("线程2");
  16. t1.start();
  17. t2.start();
  18. }
  19. }
  20. class Number implements Runnable{
  21. private int number = 1;
  22. @Override
  23. public void run() {
  24. while (true){
  25. synchronized (this){
  26. if (number <= 1000){
  27. try {
  28. Thread.sleep(500);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. System.out.println(Thread.currentThread().getName()+" : "+number);
  33. number++;
  34. }else {
  35. break;
  36. }
  37. }
  38. }
  39. }
  40. }

image.png
输出内容如下:
“线程2” 在等待的状态,”线程1” 在握锁的状态

  1. 2021-05-12 19:28:43
  2. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.291-b10 mixed mode):
  3. "DestroyJavaVM" #14 prio=5 os_prio=0 tid=0x000001cd613fa000 nid=0x6fe8 waiting on condition [0x0000000000000000]
  4. java.lang.Thread.State: RUNNABLE
  5. "线程2" #13 prio=5 os_prio=0 tid=0x000001cd77b2c000 nid=0x3528 waiting on condition [0x0000003c220ff000]
  6. java.lang.Thread.State: TIMED_WAITING (sleeping)
  7. at java.lang.Thread.sleep(Native Method)
  8. at studies.jvm.jstack.Number.run(ThreadSyncTest.java:32)
  9. - locked <0x00000007167d9378> (a studies.jvm.jstack.Number)
  10. at java.lang.Thread.run(Thread.java:748)
  11. "线程1" #12 prio=5 os_prio=0 tid=0x000001cd77ab7800 nid=0x1f34 waiting for monitor entry [0x0000003c21fff000]
  12. java.lang.Thread.State: BLOCKED (on object monitor)
  13. at studies.jvm.jstack.Number.run(ThreadSyncTest.java:29)
  14. - waiting to lock <0x00000007167d9378> (a studies.jvm.jstack.Number)
  15. at java.lang.Thread.run(Thread.java:748)
  16. "Service Thread" #11 daemon prio=9 os_prio=0 tid=0x000001cd7786d800 nid=0x2784 runnable [0x0000000000000000]
  17. java.lang.Thread.State: RUNNABLE
  18. "C1 CompilerThread3" #10 daemon prio=9 os_prio=2 tid=0x000001cd778e0800 nid=0x61d0 waiting on condition [0x0000000000000000]
  19. java.lang.Thread.State: RUNNABLE
  20. "C2 CompilerThread2" #9 daemon prio=9 os_prio=2 tid=0x000001cd778df800 nid=0x6960 waiting on condition [0x0000000000000000]
  21. java.lang.Thread.State: RUNNABLE
  22. "C2 CompilerThread1" #8 daemon prio=9 os_prio=2 tid=0x000001cd778dc800 nid=0x5248 waiting on condition [0x0000000000000000]
  23. java.lang.Thread.State: RUNNABLE
  24. "C2 CompilerThread0" #7 daemon prio=9 os_prio=2 tid=0x000001cd778db800 nid=0x53d4 waiting on condition [0x0000000000000000]
  25. java.lang.Thread.State: RUNNABLE
  26. "Monitor Ctrl-Break" #6 daemon prio=5 os_prio=0 tid=0x000001cd778d6000 nid=0xc10 runnable [0x0000003c218fe000]
  27. java.lang.Thread.State: RUNNABLE
  28. at java.net.SocketInputStream.socketRead0(Native Method)
  29. at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
  30. at java.net.SocketInputStream.read(SocketInputStream.java:171)
  31. at java.net.SocketInputStream.read(SocketInputStream.java:141)
  32. at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
  33. at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
  34. at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
  35. - locked <0x0000000716859e90> (a java.io.InputStreamReader)
  36. at java.io.InputStreamReader.read(InputStreamReader.java:184)
  37. at java.io.BufferedReader.fill(BufferedReader.java:161)
  38. at java.io.BufferedReader.readLine(BufferedReader.java:324)
  39. - locked <0x0000000716859e90> (a java.io.InputStreamReader)
  40. at java.io.BufferedReader.readLine(BufferedReader.java:389)
  41. at com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:48)
  42. "Attach Listener" #5 daemon prio=5 os_prio=2 tid=0x000001cd7572a800 nid=0x5344 waiting on condition [0x0000000000000000]
  43. java.lang.Thread.State: RUNNABLE
  44. "Signal Dispatcher" #4 daemon prio=9 os_prio=2 tid=0x000001cd75729800 nid=0x1e4 runnable [0x0000000000000000]
  45. java.lang.Thread.State: RUNNABLE
  46. "Finalizer" #3 daemon prio=8 os_prio=1 tid=0x000001cd756f7800 nid=0x4bd0 in Object.wait() [0x0000003c215ff000]
  47. java.lang.Thread.State: WAITING (on object monitor)
  48. at java.lang.Object.wait(Native Method)
  49. - waiting on <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  50. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  51. - locked <0x0000000716588ee0> (a java.lang.ref.ReferenceQueue$Lock)
  52. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  53. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
  54. "Reference Handler" #2 daemon prio=10 os_prio=2 tid=0x000001cd756f0800 nid=0x6f88 in Object.wait() [0x0000003c214ff000]
  55. java.lang.Thread.State: WAITING (on object monitor)
  56. at java.lang.Object.wait(Native Method)
  57. - waiting on <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  58. at java.lang.Object.wait(Object.java:502)
  59. at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  60. - locked <0x0000000716586c00> (a java.lang.ref.Reference$Lock)
  61. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
  62. "VM Thread" os_prio=2 tid=0x000001cd756c5800 nid=0x6ffc runnable
  63. "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x000001cd61411000 nid=0x5bf8 runnable
  64. "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x000001cd61412800 nid=0x38c0 runnable
  65. "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x000001cd61413800 nid=0x2d44 runnable
  66. "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x000001cd61415000 nid=0x305c runnable
  67. "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x000001cd61417000 nid=0x4e4c runnable
  68. "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x000001cd61418000 nid=0x75e8 runnable
  69. "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x000001cd6141c000 nid=0x6d10 runnable
  70. "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x000001cd6141d000 nid=0x1dc0 runnable
  71. "VM Periodic Task Thread" os_prio=2 tid=0x000001cd77a2c800 nid=0x4d48 waiting on condition
  72. JNI global references: 12

2.2、基本参数

1、option参数: -F

当正常输出的请求不被响应时,强制输出线程堆栈

2、option参数: -l

除堆栈外,显示关于锁的附加信息

3、option参数: -m

如果调用到本地方法的话,可以显示C/C++的堆栈

4、option参数: -h

帮助操作

三、用java代码监控线程

代码:

  1. package studies.jvm.jstack;
  2. import java.util.Map;
  3. import java.util.Set;
  4. /**
  5. * @Date: 2021/5/12
  6. * @Time: 19:39
  7. * @BelongsProject base
  8. * @BelongsPackage studies.jvm.jstack
  9. */
  10. public class AllStackTrace {
  11. public static void main(String[] args) {
  12. //追踪当前进程中的所有的线程
  13. Map<Thread, StackTraceElement[]> all = Thread.getAllStackTraces();
  14. Set<Map.Entry<Thread, StackTraceElement[]>> entries = all.entrySet();
  15. for (Map.Entry<Thread, StackTraceElement[]> en : entries){
  16. Thread t = en.getKey();
  17. StackTraceElement[] v = en.getValue();
  18. System.out.println("【Thread name is : "+t.getName()+" 】");
  19. for (StackTraceElement s : v){
  20. System.out.println("\t"+s.toString());
  21. }
  22. }
  23. }
  24. }

输出:

  1. Thread name is : Monitor Ctrl-Break
  2. java.net.PlainSocketImpl.<init>(PlainSocketImpl.java:98)
  3. java.net.SocksSocketImpl.<init>(SocksSocketImpl.java:56)
  4. java.net.Socket.setImpl(Socket.java:520)
  5. java.net.Socket.<init>(Socket.java:441)
  6. java.net.Socket.<init>(Socket.java:228)
  7. com.intellij.rt.execution.application.AppMainV2$1.run(AppMainV2.java:43)
  8. Thread name is : Signal Dispatcher
  9. Thread name is : Finalizer
  10. java.lang.Object.wait(Native Method)
  11. java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  12. java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  13. java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)
  14. Thread name is : Attach Listener
  15. Thread name is : main
  16. java.lang.Thread.dumpThreads(Native Method)
  17. java.lang.Thread.getAllStackTraces(Thread.java:1610)
  18. studies.jvm.jstack.AllStackTrace.main(AllStackTrace.java:19)
  19. Thread name is : Reference Handler
  20. java.lang.Object.wait(Native Method)
  21. java.lang.Object.wait(Object.java:502)
  22. java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  23. java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
  24. Process finished with exit code 0