死锁的产生条件与排查方法
请说明死锁产生的四个必要条件,以及使用jstack和VisualVM排查死锁的具体步骤。
回答
苦行僧
死锁四个必要条件(缺一不可):
- 互斥:资源每次只能被一个线程使用。
- 占有且等待:线程已占有一个资源,同时等待另一个资源。
- 不可剥夺:资源在未使用完前不能被强制剥夺。
- 循环等待:多个线程形成循环等待关系(A等B,B等C,C等A)。
排查方法:
jstack命令:
jps -l查看Java进程PID。jstack -l <PID>打印线程堆栈。- 搜索
Found one Java-level deadlock,jstack会自动检测死锁。 - 查看线程状态(BLOCKED)和等待的锁、持有的锁。
VisualVM:
- 启动VisualVM,连接目标进程。
- 点击**线程(Threads)**标签。
- 查看死锁检测(Detect Deadlock),自动标识死锁线程。
- 分析线程转储中的锁信息。
预防:破坏其中一个条件,如破坏循环等待(全局顺序加锁)。