成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

四個Java死鎖檢測工具

開發 前端
在 Java 中,死鎖(Deadlock)情況是指:兩個或兩個以上的線程持有不同系統資源的鎖,線程彼此都等待獲取對方的鎖來完成自己的任務,但是沒有讓出自己持有的鎖,線程就會無休止等待下去。

線程競爭的資源可以是:鎖、網絡連接、通知事件,磁盤、帶寬,以及一切可以被稱作“資源”的東西。

在程序執行的時候,難免會遇到死鎖的情況。

下面介紹一下如何排查Java中的死鎖線程。

先來個死鎖的例子:

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDeadLock {
static Lock lock1 = new ReentrantLock();
static Lock lock2 = new ReentrantLock();

public static void main(String[] args) throws InterruptedException {
Thread thread1 = new Thread(new DeadLockDemo(lock1, lock2), "Thread1");
Thread thread2 = new Thread(new DeadLockDemo(lock2, lock1), "Thread2");
thread1.start();
thread2.start();
}

static class DeadLockDemo implements Runnable {
Lock lockA;
Lock lockB;

public DeadLockDemo(Lock lockA, Lock lockB) {
this.lockA = lockA;
this.lockB = lockB;
}

@Override
public void run() {
try {
lockA.lock();
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockA + "\t 嘗試獲得:" + lockB);
TimeUnit.SECONDS.sleep(2);
lockB.lock();
System.out.println(Thread.currentThread().getName() + "\t 自己持有:" + lockB + "\t 嘗試獲得:" + lockA);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lockA.unlock();
lockB.unlock();
System.out.println(Thread.currentThread().getName() + "正常結束!");
}
}
}
}

執行該類,可以明顯看到,程序不會自動結束,說明還有線程占用資源或者等待資源。

首先使用 jps 命令列出當前的Java進程:

下面使用一些工具進行抓取死鎖的線程。

1、jstack

找到疑似死鎖的例子,找到 PID,上圖中可以看到 20148 線程是我上面執行死鎖的例子:

> jstack -l 20148
20148 com.yudianxx.basic.線程.ReentrantLock.ReentrantLockDeadLock

jps -l ; -l 參數可以顯示完整的啟動類

執行 jstack -l 20148

往下找,會顯示一段 deadlock 的關鍵字:

再看到下面,提示:

at com.yudianxx.basic.線程.ReentrantLock.ReentrantLockDeadLock$DeadLockDemo.run(ReentrantLockDeadLock.java:39)

也就是 ReentrantLockDeadLock 類下的 lockB.lock() 這一行。

即可定位到死鎖的類和行數。

2、jconsole

jconsole 位于 JDK 的 bin 目錄,雙擊即可運行。

如下,選擇需要建立連接的進程。

切換到 線程,再點擊下方的 檢測死鎖 ,即可查看死鎖的情況:

除此之外,jconsole 還可以查看堆內存、CPU、線程數 等其他信息。

3、jvisualvm

jvisualvm 也在 JDK 的 bin 目錄。

選擇本地的進程,上方切換至 線程 ,再點擊一下 線程Dump 即可。

點擊后可以看到線程的狀態日志,可以看到死鎖的信息:

4、jmc

同樣位于 JDK 的 bin 目錄。

打開你需要監測的進程:

下方切換到 線程

圖中看到的就是死鎖的標識。

以上就是定位java線程死鎖的工具,推薦使用 jstack 命令,畢竟后三個工具在Linux中是沒有的。

jstack 通過找到類入口,再找出當前線程正在等待哪個線程,然后再定位到死鎖的行數,即可定位引起死鎖的原因。


責任編輯:華軒 來源: HelloCoder
相關推薦

2021-12-13 16:16:42

Java開發工具

2020-09-20 22:10:04

Google 開源工具

2015-03-13 09:10:29

2021-04-14 08:20:46

Lighthouse工具性能檢測

2010-06-04 10:09:29

Linux 性能檢測

2010-06-04 10:30:15

Linux 性能檢測

2011-01-11 13:58:32

WebLog ExpeWEB服務器流量記錄

2022-02-23 15:09:18

數字化轉型國有企業數據

2021-07-01 05:17:52

Windows 11操作系統微軟

2012-07-20 09:41:41

IT系統云計算架構

2014-04-15 17:03:00

2015-10-30 14:46:50

2022-08-05 14:26:50

Kubernetes容器工具

2021-10-23 16:16:05

LinuxLinux工具

2010-06-04 09:59:37

Linux 性能檢測

2009-06-03 14:15:34

2014-06-06 10:01:31

2024-06-25 12:45:05

2013-03-18 13:31:28

2009-05-20 10:09:55

編碼習慣代碼風格Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆视频在线免费看 | 狠狠骚| 一级a性色生活片久久毛片波多野 | 中文字幕一区二区三区在线观看 | 狠狠的干 | 极品国产视频 | 久久久亚洲 | 亚洲欧洲精品成人久久奇米网 | 欧美v免费 | 欧美久久久久久 | www.日韩系列 | 午夜精品一区二区三区在线视频 | 久久美女网| 亚洲精品二区 | 成人精品国产免费网站 | 中文字幕中文字幕 | 国产一区二区中文字幕 | 久久国产精品一区二区三区 | 国产乱码久久久久久 | 日韩精品a在线观看图片 | 久久网亚洲 | 欧美一级特黄aaa大片在线观看 | 伊人网在线看 | 麻豆视频在线免费观看 | 欧美精品一区二区在线观看 | 天天玩天天操天天干 | 中文在线а√在线8 | 一级黄色片在线免费观看 | 天天操天天摸天天爽 | 欧美亚洲成人网 | 日韩精品免费在线观看 | 人人干人人草 | 一级毛片大全免费播放 | 免费在线视频a | 免费av观看 | 久久久av| 日韩成人免费av | 一区二区三区久久久 | 看一级毛片 | 中文字幕精品一区 | 午夜精品久久久久久久星辰影院 |