使用JConsole和jstack检测分析死锁

JConsole

  1. 首先启动死锁测试demo程序
  2. 在cmd中运行jconsole打开图形化界面工具
  3. 选择我们需要分析的进程进行连接
    JConsole新建连接
  4. 选择线程选项,点击底部检测死锁功能
    JConsole检测死锁

  5. 查看死锁线程详情
    Thread-1
    Thread-0

线程1想获取的锁被线程0所持有,线程0想获取的锁被线程1持有,两个线程都在互相等待获取被对方所持有的锁资源,因此造成了死锁。

Jstack

首先通过jps查看当前运行的Java进程

C:\Users\Sylvia\Desktop>jps
16464 Launcher
20692
9620 DeadLockTest
15544 Jps
10636 RemoteMavenServer
9148 JConsole

通过jstack分析死锁,可以查看到当前死锁详情

jstack -l 9620

Found one Java-level deadlock:
=============================
"Thread-1":
  waiting to lock monitor 0x0000000005037be8 (object 0x000000076f5987c0, a java.lang.Object),
  which is held by "Thread-0"
"Thread-0":
  waiting to lock monitor 0x000000000503a688 (object 0x000000076f5987d0, a java.lang.Object),
  which is held by "Thread-1"

Java stack information for the threads listed above:
===================================================
"Thread-1":
        at com.laravelshao.thread.deadlock.DeadLock.run(DeadLock.java:36)
        - waiting to lock <0x000000076f5987c0> (a java.lang.Object)
        - locked <0x000000076f5987d0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)
"Thread-0":
        at com.laravelshao.thread.deadlock.DeadLock.run(DeadLock.java:27)
        - waiting to lock <0x000000076f5987d0> (a java.lang.Object)
        - locked <0x000000076f5987c0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

猜你喜欢

转载自blog.csdn.net/laravelshao/article/details/80375543