死锁检测
代码:
public class DeadLock {
public static void main(String[] args) {
Object a = new Object();
Object b = new Object();
new Thread(() -> {
while (true) {
synchronized (a) {
synchronized (b) {
System.out.println("线程A");
}
}
}
}).start();
new Thread(() -> {
while (true) {
synchronized (b) {
synchronized (a) {
System.out.println("线程B");
}
}
}
}).start();
}
}
1.通过jConsole检测死锁
通过jConsole连接上进程后,点击线程,会看到检测死锁按钮。
死锁界面会显示只有锁的线程,还有持有锁的位置
2.通过jvisualvm检测死锁
点击线程Dump后,会有死锁线程的提示。也可以将线程Dump信息复制出来,通过一些第三方工具进行分析,比如:fastthread
然而生产环境,是不允许我们在本地使用可视化工具进行连接的。
3.通过arthas检测
通过命令:thread -b
4.通过jdk的工具:jstack命令
stack -l 54726
也可以通过
jstack -l 54726 >> /data/logs/stack.txt
将线程堆栈信息存入本地文件,便于分析