文章目录
- 1.什么是死锁
- 2.死锁怎么产生的
- 3.如何进行死锁诊断?
- 3.1 通过命令查看
- 3.2 jconsole可视化工具
- 3.2 VisualVM:故障处理工具
1.什么是死锁
死锁(Deadlock)是指两个或多个进程(线程)在执行过程中,由于竞争资源而陷入无限等待的状态
,导致它们都无法继续执行下去。简单来说,就是一种互相等待对方释放资源的情况,
从而造成所有参与者都无法继续执行的僵局。
2.死锁怎么产生的
产生的四个必要条件如下:(缺一不可)
互斥条件
:一个资源同一时间能且只能被一个线程访问;不可掠夺
:当资源被一个线程占用时,其他线程不可抢夺该资源;请求与等待
:当资源被一个线程占用时,其他线程只能等待资源的释放再拥有;循环等待
:指的是若干线程形成头尾相接的情况,将所有资源都占用导致的整体死锁或局部死锁。
一个线程需要同时获取多把锁,这时就容易发生死锁
前三条其实就是作为锁的条件,第四条(循环等待)就是造成死锁的主要原因
循环等待
也就是双方的锁都锁住了对方,并且都在等待对方的解锁,造成死循环(类似springbean的循环依赖)
3.如何进行死锁诊断?
示例代码:
线程t1和线程t2造成资源争抢,造成死锁
3.1 通过命令查看
第一:通过jps命令
查看运行的线程
第二,使用jstack查看线程运行的情况,下图是截图的关键信息
运行命令:jstack -l 46032
3.2 jconsole可视化工具
用于对jvm的内存,线程,类 的监控,是一个基于 jmx 的 GUI 性能监控工具
打开方式:java 安装目录 bin目录下 直接启动 jconsole.exe 就行
- 选择进程
- 点击线程:可查看到死锁的线程,死锁出现在代码哪一行
3.2 VisualVM:故障处理工具
能够监控线程
,内存情况
,查看方法的CPU时间和内存中的对 象
,已被GC的对象,反向查看分配的堆栈
打开方式:java 安装目录 bin目录下 直接启动 jvisualvm.exe就行
参考来自黑马程序员