jconsole來檢測死鎖是很方便的,當然也有更多其他功能,這裏做一下簡單演示,後邊還會繼續補充!
產生死鎖代碼
代碼:
package worktest;
/**
* @author jeffSmile
* @date 2020-04-28 上午 10:32
* @desc 死鎖
*/
public class DeadLock {
private static Object resourceA = new Object();
private static Object resourceB = new Object();
public static void main(String[] args) {
Thread threadA = new Thread(new Runnable() {
@Override
public void run() {
synchronized (resourceA){
System.out.println(Thread.currentThread()+" get ResourceA");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread()+" waiting ResourceB");
synchronized (resourceB){
System.out.println(Thread.currentThread()+" get ResourceB");
}
}
}
});
Thread threadB = new Thread(new Runnable() {
@Override
public void run() {
synchronized (resourceB){
System.out.println(Thread.currentThread()+" get ResourceB");
try{
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread()+" waiting ResourceA");
synchronized (resourceA){
System.out.println(Thread.currentThread()+" get ResourceA");
}
}
}
});
threadA.start();
threadB.start();
}
}
運行後代碼就卡在這了!
運行Jconsole
接下來我們用jdk自帶的jconsole來檢測下死鎖的狀態!
- 進入D:\Java\jdk1.8.0_201\bin
- 選擇需要監控的本地進程:
Jconsole界面功能介紹
概覽
- 概覽中顯示的是虛擬機主要運行數據的情況,包括“堆內存使用情況”、“線程”、”類“、“Cpu使用情況”
內存
內存監控相當於是jstat的可視化命令,用於監控虛擬機內存(主要是java堆和永久代)的變化趨勢。
線程
線程標籤頁相當於是jstack命令的可視化,
類
類標籤主要查看加載的類的數量
檢測死鎖:
可以看到thread-1和thread-0形成了死鎖!