简介
在
Java避坑指南:使用锁排序和尝试获取所有锁来避免死锁
中介绍了开发中如何避免死锁,那我们如何去定位或主动发现死锁的现象呢?
定位死锁-jstack工具
利用java的命令行工具:jps + jstack 组合可以得到Thread Dump:
jstack命令后,输出内容的最后一行很容易发现死锁现象。
定位死锁-ThreadMXBean监控工具
java的线程监控工具ThreadMXBean,提供了方法:findDeadlockedThreads来检测死锁。
死锁示例:
利用ThreadMXBean检测死锁并打印死锁相关信息:
死锁相关信息输出:
定位死锁-在线工具FastThread
FastThread可能是分析生产环境中线程Dump文件的最佳在线工具。它提供了一个非常好的图形用户界面。它还包括多种功能,如线程的CPU使用率、堆栈长度以及最常用和最复杂的方法:
定位死锁-在线工具JStack Review
JStack Review是一个在线工具,用于分析Dump。从安全角度来看,它不会存储数据到云,这是使用它的一个主要优势。它提供了所有线程的图形化概述,显示了正在运行的方法,还按状态对它们进行了分组。JStack Review将产生堆栈的线程与其他线程分开,这一点非常重要,例如,内部进程。最后,它还包括同步器和忽略的行:
如何修复死锁
在生产环境,绝大部分都是赶紧离线出问题的服务即:从注册中心下线,保留现场,利用上面的分析工具去分析死锁的原因,当然如何想好彻底杜绝死锁,必须在编码阶段养成良好的编码习惯了。
小结
如果死锁发生了,我们提供了几种定位死锁,修复死锁的几种方法。