日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
四個(gè)Java死鎖檢測工具

在程序執(zhí)行的時(shí)候,難免會(huì)遇到死鎖的情況。

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

先來個(gè)死鎖的例子:

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() + "正常結(jié)束!");
}
}
}
}

執(zhí)行該類,可以明顯看到,程序不會(huì)自動(dòng)結(jié)束,說明還有線程占用資源或者等待資源。

首先使用 jps 命令列出當(dāng)前的Java進(jìn)程:

下面使用一些工具進(jìn)行抓取死鎖的線程。

1、jstack

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

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

jps -l ; -l 參數(shù)可以顯示完整的啟動(dòng)類

執(zhí)行 jstack -l 20148

往下找,會(huì)顯示一段 deadlock 的關(guān)鍵字:

再看到下面,提示:

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

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

即可定位到死鎖的類和行數(shù)。

2、jconsole

jconsole 位于 JDK 的 bin 目錄,雙擊即可運(yùn)行。

如下,選擇需要建立連接的進(jìn)程。

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

除此之外,jconsole 還可以查看堆內(nèi)存、CPU、線程數(shù) 等其他信息。

3、jvisualvm

jvisualvm 也在 JDK 的 bin 目錄。

選擇本地的進(jìn)程,上方切換至 線程 ,再點(diǎn)擊一下 線程Dump 即可。

點(diǎn)擊后可以看到線程的狀態(tài)日志,可以看到死鎖的信息:

4、jmc

同樣位于 JDK 的 bin 目錄。

打開你需要監(jiān)測的進(jìn)程:

下方切換到 線程

圖中看到的就是死鎖的標(biāo)識(shí)。

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

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


網(wǎng)站名稱:四個(gè)Java死鎖檢測工具
文章起源:http://www.dlmjj.cn/article/dpgcphi.html