目录
引言:在实际开发中由于锁的使用不当可能回造成死锁的现象,那么该怎么判断是否发生死锁了呢?在这里介绍两个jdk提供的工具
首先我们先手动创建一个简单的死锁环境运行成功后,看下面推荐的两个jdk提供的工具
import java.util.concurrent.TimeUnit;
public class text {
static Object lockA = new Object();
static Object lockB = new Object();
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
synchronized (lockA){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockB){
}
}
}).start();
new Thread(()->{
synchronized (lockB){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lockA){
}
}
}).start();
}
}
一、jconsole
1、在cmd中输入jconsole,点击回车后回弹出相关的框框
2、点击本地连接,然后要查看的进程,然后点击连接
3、在弹出的页面中点击不安全连接
4、点击检测死锁
5、点击相关的线程查看信息,可以定位到java代码可能发生死锁的位子
二、jvisualvm
1、在cmd中直接输入jvisualvm,点击回车会弹出框框
2、选择要查看的进程双击
3、双击之后会展示进程相关信息,这时候点击线程,查看线程信息
4、如果存在死锁,会出现下图的样式,然后点击红色框框中的线程Dump
5、点击线程Dump之后进入新页面拖到最底下就能看到线程死锁相关信息
总结:jdk提供的这两款可视化工具不仅能够给我们排查死锁情况,还能让我们实时监控内存的使用,很牛就是了