检测死锁可以使用jconsole工具,或者使用jps定位进行id,再用jstack定位死锁。

1、jps定位线程id,再使用jstack定位死锁

  • jps定位线程id:

    image.png

  • 找到运行的线程id后,使用jstack再定位死锁: ```java D:\java workspace\bingfa>jstack 84728 2022-02-07 17:52:42 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode):

“DestroyJavaVM” #16 prio=5 os_prio=0 tid=0x0000000002963800 nid=0x152ec waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“t2” #15 prio=5 os_prio=0 tid=0x000000001a0e4800 nid=0x144b0 waiting for monitor entry [0x000000001aa3f000] java.lang.Thread.State: BLOCKED (on object monitor) at TestDeadLock.lambda$test1$1(TestDeadLock.java:32)

  1. - waiting to lock <0x00000000db2a6ed8> (a java.lang.Object)
  2. - locked <0x00000000db2a6ee8> (a java.lang.Object)
  3. at TestDeadLock$$Lambda$2/1510067370.run(Unknown Source)
  4. at java.lang.Thread.run(Thread.java:748)

“t1” #14 prio=5 os_prio=0 tid=0x000000001a0e3800 nid=0x2664 waiting for monitor entry [0x000000001a93f000] java.lang.Thread.State: BLOCKED (on object monitor) at TestDeadLock.lambda$test1$0(TestDeadLock.java:17)

  1. - waiting to lock <0x00000000db2a6ee8> (a java.lang.Object)
  2. - locked <0x00000000db2a6ed8> (a java.lang.Object)
  3. at TestDeadLock$$Lambda$1/245672235.run(Unknown Source)
  4. at java.lang.Thread.run(Thread.java:748)

“Service Thread” #13 daemon prio=9 os_prio=0 tid=0x00000000191a2000 nid=0xfec8 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“C1 CompilerThread3” #12 daemon prio=9 os_prio=2 tid=0x0000000019113800 nid=0x15408 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“C2 CompilerThread2” #11 daemon prio=9 os_prio=2 tid=0x0000000019110000 nid=0x12d78 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“C2 CompilerThread1” #10 daemon prio=9 os_prio=2 tid=0x000000001910f000 nid=0x157e4 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“C2 CompilerThread0” #9 daemon prio=9 os_prio=2 tid=0x000000001910c800 nid=0x1457c waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“JDWP Command Reader” #8 daemon prio=10 os_prio=0 tid=0x0000000019093000 nid=0x7998 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“JDWP Event Helper Thread” #7 daemon prio=10 os_prio=0 tid=0x0000000019087000 nid=0x1510c runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“JDWP Transport Listener: dt_socket” #6 daemon prio=10 os_prio=0 tid=0x000000001907a800 nid=0xd1a4 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“Attach Listener” #5 daemon prio=5 os_prio=2 tid=0x0000000019016800 nid=0x1548c waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“Signal Dispatcher” #4 daemon prio=9 os_prio=2 tid=0x0000000019073000 nid=0x12d94 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE

“Finalizer” #3 daemon prio=8 os_prio=1 tid=0x0000000019000800 nid=0x15644 in Object.wait() [0x00000000194df000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method)

  1. - waiting on <0x00000000db008ed0> (a java.lang.ref.ReferenceQueue$Lock)
  2. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
  3. - locked <0x00000000db008ed0> (a java.lang.ref.ReferenceQueue$Lock)
  4. at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
  5. at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:216)

“Reference Handler” #2 daemon prio=10 os_prio=2 tid=0x0000000002a5a000 nid=0x15114 in Object.wait() [0x0000000018fdf000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method)

  1. - waiting on <0x00000000db006bf8> (a java.lang.ref.Reference$Lock)
  2. at java.lang.Object.wait(Object.java:502)
  3. at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
  4. - locked <0x00000000db006bf8> (a java.lang.ref.Reference$Lock)
  5. at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

“VM Thread” os_prio=2 tid=0x0000000017109000 nid=0xea54 runnable

“GC task thread#0 (ParallelGC)” os_prio=0 tid=0x0000000002979000 nid=0x15518 runnable

“GC task thread#1 (ParallelGC)” os_prio=0 tid=0x000000000297a800 nid=0x14bc0 runnable

“GC task thread#2 (ParallelGC)” os_prio=0 tid=0x000000000297c000 nid=0x14140 runnable

“GC task thread#3 (ParallelGC)” os_prio=0 tid=0x000000000297d800 nid=0x14084 runnable

“GC task thread#4 (ParallelGC)” os_prio=0 tid=0x0000000002980800 nid=0x7b00 runnable

“GC task thread#5 (ParallelGC)” os_prio=0 tid=0x0000000002982000 nid=0x30a4 runnable

“GC task thread#6 (ParallelGC)” os_prio=0 tid=0x0000000002985000 nid=0x15238 runnable

“GC task thread#7 (ParallelGC)” os_prio=0 tid=0x0000000002986000 nid=0x12ff0 runnable

“VM Periodic Task Thread” os_prio=2 tid=0x00000000191d8000 nid=0x26b4 waiting on condition

JNI global references: 2412

Found one Java-level deadlock:

“t2”: waiting to lock monitor 0x0000000017110bd8 (object 0x00000000db2a6ed8, a java.lang.Object), which is held by “t1” “t1”: waiting to lock monitor 0x0000000017113518 (object 0x00000000db2a6ee8, a java.lang.Object), which is held by “t2”

Java stack information for the threads listed above:

“t2”: at TestDeadLock.lambda$test1$1(TestDeadLock.java:32)

  1. - waiting to lock <0x00000000db2a6ed8> (a java.lang.Object)
  2. - locked <0x00000000db2a6ee8> (a java.lang.Object)
  3. at TestDeadLock$$Lambda$2/1510067370.run(Unknown Source)
  4. at java.lang.Thread.run(Thread.java:748)

“t1”: at TestDeadLock.lambda$test1$0(TestDeadLock.java:17)

  1. - waiting to lock <0x00000000db2a6ee8> (a java.lang.Object)
  2. - locked <0x00000000db2a6ed8> (a java.lang.Object)
  3. at TestDeadLock$$Lambda$1/245672235.run(Unknown Source)
  4. at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

```

2、直接jconsole定位死锁

注意jconsole是jdk自带的工具,直接在命令行输入jconsole即可
image.png

直接有检查死锁的工具
image.png