检测死锁可以使用jconsole工具,或者使用jps定位进行id,再用jstack定位死锁。
1、jps定位线程id,再使用jstack定位死锁
jps定位线程id:
找到运行的线程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)
- waiting to lock <0x00000000db2a6ed8> (a java.lang.Object)
- locked <0x00000000db2a6ee8> (a java.lang.Object)
at TestDeadLock$$Lambda$2/1510067370.run(Unknown Source)
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)
- waiting to lock <0x00000000db2a6ee8> (a java.lang.Object)
- locked <0x00000000db2a6ed8> (a java.lang.Object)
at TestDeadLock$$Lambda$1/245672235.run(Unknown Source)
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)
- waiting on <0x00000000db008ed0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:144)
- locked <0x00000000db008ed0> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:165)
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)
- waiting on <0x00000000db006bf8> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:502)
at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
- locked <0x00000000db006bf8> (a java.lang.ref.Reference$Lock)
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)
- waiting to lock <0x00000000db2a6ed8> (a java.lang.Object)
- locked <0x00000000db2a6ee8> (a java.lang.Object)
at TestDeadLock$$Lambda$2/1510067370.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
“t1”: at TestDeadLock.lambda$test1$0(TestDeadLock.java:17)
- waiting to lock <0x00000000db2a6ee8> (a java.lang.Object)
- locked <0x00000000db2a6ed8> (a java.lang.Object)
at TestDeadLock$$Lambda$1/245672235.run(Unknown Source)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
```
2、直接jconsole定位死锁
注意jconsole是jdk自带的工具,直接在命令行输入jconsole即可
直接有检查死锁的工具