【Java并发】如何进行死锁诊断?

文章目录

    • 1.什么是死锁
    • 2.死锁怎么产生的
    • 3.如何进行死锁诊断?
      • 3.1 通过命令查看
      • 3.2 jconsole可视化工具
      • 3.2 VisualVM:故障处理工具

1.什么是死锁

死锁(Deadlock)是指两个或多个进程(线程)在执行过程中,由于竞争资源而陷入无限等待的状态,导致它们都无法继续执行下去。简单来说,就是一种互相等待对方释放资源的情况,从而造成所有参与者都无法继续执行的僵局。

2.死锁怎么产生的

产生的四个必要条件如下:(缺一不可)

  1. 互斥条件:一个资源同一时间能且只能被一个线程访问;
  2. 不可掠夺:当资源被一个线程占用时,其他线程不可抢夺该资源;
  3. 请求与等待:当资源被一个线程占用时,其他线程只能等待资源的释放再拥有;
  4. 循环等待:指的是若干线程形成头尾相接的情况,将所有资源都占用导致的整体死锁或局部死锁。

一个线程需要同时获取多把锁,这时就容易发生死锁

前三条其实就是作为锁的条件,第四条(循环等待)就是造成死锁的主要原因

循环等待也就是双方的锁都锁住了对方,并且都在等待对方的解锁,造成死循环(类似springbean的循环依赖)
【Java并发】如何进行死锁诊断?_第1张图片

3.如何进行死锁诊断?

示例代码:
线程t1和线程t2造成资源争抢,造成死锁
【Java并发】如何进行死锁诊断?_第2张图片

3.1 通过命令查看

第一:通过jps命令查看运行的线程
【Java并发】如何进行死锁诊断?_第3张图片
第二,使用jstack查看线程运行的情况,下图是截图的关键信息
运行命令:jstack -l 46032
【Java并发】如何进行死锁诊断?_第4张图片

3.2 jconsole可视化工具

用于对jvm的内存,线程,类 的监控,是一个基于 jmx 的 GUI 性能监控工具
打开方式:java 安装目录 bin目录下 直接启动 jconsole.exe 就行

  • 选择进程

【Java并发】如何进行死锁诊断?_第5张图片

  • 点击线程:可查看到死锁的线程,死锁出现在代码哪一行
    【Java并发】如何进行死锁诊断?_第6张图片

3.2 VisualVM:故障处理工具

能够监控线程内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈
打开方式:java 安装目录 bin目录下 直接启动 jvisualvm.exe就行
【Java并发】如何进行死锁诊断?_第7张图片
【Java并发】如何进行死锁诊断?_第8张图片
参考来自黑马程序员

你可能感兴趣的:(Java,java,开发语言)