java dumpAllThreads參數(shù)解析

ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = tmx.dumpAllThreads(true, true);

通過上面的代碼,我們可以將jvm進(jìn)程的所有線程及堆棧dump下來洗鸵。我們可以看到dump方法有兩個(gè)參數(shù): dumpAllThreads(boolean lockedMonitors, boolean lockedSynchronizers)

這兩個(gè)參數(shù)分別控制兩種鎖ThreadInfo .getLockedMonitors() 和ThreadInfo.getLockedSynchronizers()

a. Monitor 鎖

就是我們傳統(tǒng)使用的synchronized(Object obj),可以通過MonitorInfo[]得到具體的鎖的數(shù)量和信息

  • 如果項(xiàng)目中使用synchronized幢痘,在dumpAllThreads第一個(gè)參數(shù)設(shè)置為true瀑踢,就可以通過ThreadInfo.getLockedMonitors()獲取線程持有的monitor
  • 相反如果一個(gè)參數(shù)設(shè)置為false辨宠,ThreadInfo.getLockedMonitors()這個(gè)就會(huì)返回為空

b. Locked ownable synchronizers 鎖

常指的ReentrantLock 和 ReentrantReadWriteLock 鎖
通過得到LockInfo[] 可以得到具體的類,鎖的數(shù)量和信息

  • 如果項(xiàng)目中使用ReentrantLock琳省,在dumpAllThreads第二個(gè)參數(shù)設(shè)置為true迎吵,就可以通過ThreadInfo.getLockedSynchronizers()獲取線程持有的該類型鎖。
  • 相反如果第二個(gè)參數(shù)設(shè)置為false针贬,ThreadInfo.getLockedSynchronizers()這個(gè)就會(huì)返回為空

注意

ThreadMXBean.dumpAllThreads(true,true)因?yàn)橐@取所有jvm線程的monitor和synchronizer信息击费,會(huì)掛起執(zhí)行線程。對(duì)負(fù)載較大的服務(wù)器端程序桦他,會(huì)引起latency飆升

下面我們通過一個(gè)示例看一下兩個(gè)參數(shù)作用
public class RtTest {

    public static void main(String[] args) {
        final RtTest rt = new RtTest();
        for (int i = 0; i < 2; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    rt.processLock();
                }
            });
            t.start();
        }

        final RtTest rt2 = new RtTest();
        for (int i = 0; i < 2; i++) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    rt2.processSync();
                }
            });
            t.start();
        }

        ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
        ThreadInfo[] threadInfos = tmx.dumpAllThreads(true, true);
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println(threadInfo);
        }

        System.out.println("hhhhhhhhhh");
        for (ThreadInfo threadInfo : threadInfos) {
            for (MonitorInfo lockedMonitor : threadInfo.getLockedMonitors()) {
                System.out.println(threadInfo.getThreadName()+":");
                System.out.println(lockedMonitor);
            }

        }

        System.out.println("oooooooo");
        for (ThreadInfo threadInfo : threadInfos) {
            for (LockInfo lockedSynchronizer : threadInfo.getLockedSynchronizers()) {
                System.out.println(threadInfo.getThreadName()+":");
                System.out.println(lockedSynchronizer);
            }

        }

    }

    public synchronized int processLock(){
        int l =0;
        for (int i = 0; i < 1000*1000*1000; i++) {
            l += i*i;
        }
        return l;
    }

    public synchronized void processSync(){
        ReentrantLock reentrantLock = new ReentrantLock();
        reentrantLock.lock();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        reentrantLock.unlock();
    }

結(jié)果輸出如下:

"Thread-3" Id=14 BLOCKED on RtTest@2626b418 owned by "Thread-2" Id=13
    at RtTest.processSync(RtTest.java:69)
    -  blocked on RtTest@2626b418
    at RtTest$2.run(RtTest.java:28)
    at java.lang.Thread.run(Thread.java:745)


"Thread-2" Id=13 TIMED_WAITING
    at java.lang.Thread.sleep(Native Method)
    at RtTest.processSync(RtTest.java:72)
    -  locked RtTest@2626b418
    at RtTest$2.run(RtTest.java:28)
    at java.lang.Thread.run(Thread.java:745)

    Number of locked synchronizers = 1
    - java.util.concurrent.locks.ReentrantLock$NonfairSync@5a07e868


"Thread-1" Id=12 BLOCKED on RtTest@76ed5528 owned by "Thread-0" Id=11
    at RtTest.processLock(RtTest.java:61)
    -  blocked on RtTest@76ed5528
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)


"Thread-0" Id=11 RUNNABLE
    at RtTest.processLock(RtTest.java:62)
    -  locked RtTest@76ed5528
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)


"Monitor Ctrl-Break" Id=5 RUNNABLE
    at java.net.NetworkInterface.init(Native Method)
    at java.net.NetworkInterface.<clinit>(NetworkInterface.java:64)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    -  locked java.net.SocksSocketImpl@2c7b84de
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    ...


"Signal Dispatcher" Id=4 RUNNABLE


"Finalizer" Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@3fee733d
    at java.lang.Object.wait(Native Method)
    -  waiting on java.lang.ref.ReferenceQueue$Lock@3fee733d
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)


"Reference Handler" Id=2 WAITING on java.lang.ref.Reference$Lock@5acf9800
    at java.lang.Object.wait(Native Method)
    -  waiting on java.lang.ref.Reference$Lock@5acf9800
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)


"main" Id=1 RUNNABLE
    at sun.management.ThreadImpl.dumpThreads0(Native Method)
    at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446)
    at RtTest.main(RtTest.java:35)


hhhhhhhhhh
Thread-2:
RtTest@2626b418
Thread-0:
RtTest@76ed5528
Monitor Ctrl-Break:
java.net.SocksSocketImpl@2c7b84de
oooooooo
Thread-2:
java.util.concurrent.locks.ReentrantLock$NonfairSync@5a07e868

如果我們dump參數(shù)全部設(shè)置為false蔫巩,即: ThreadInfo[] threadInfos = tmx.dumpAllThreads(false, false); 結(jié)果如下:

"Thread-3" Id=14 BLOCKED on RtTest@2626b418 owned by "Thread-2" Id=13
    at RtTest.processSync(RtTest.java:69)
    -  blocked on RtTest@2626b418
    at RtTest$2.run(RtTest.java:28)
    at java.lang.Thread.run(Thread.java:745)


"Thread-2" Id=13 TIMED_WAITING
    at java.lang.Thread.sleep(Native Method)
    at RtTest.processSync(RtTest.java:72)
    at RtTest$2.run(RtTest.java:28)
    at java.lang.Thread.run(Thread.java:745)


"Thread-1" Id=12 BLOCKED on RtTest@5a07e868 owned by "Thread-0" Id=11
    at RtTest.processLock(RtTest.java:61)
    -  blocked on RtTest@5a07e868
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)


"Thread-0" Id=11 RUNNABLE
    at RtTest.processLock(RtTest.java:62)
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)


"Monitor Ctrl-Break" Id=5 RUNNABLE
    at java.lang.ClassLoader$NativeLibrary.find(Native Method)
    at java.lang.ClassLoader.findNative(ClassLoader.java:1960)
    at java.net.NetworkInterface.getAll(Native Method)
    at java.net.NetworkInterface.getNetworkInterfaces(NetworkInterface.java:343)
    at java.net.DefaultInterface.chooseDefaultInterface(DefaultInterface.java:67)
    at java.net.DefaultInterface.<clinit>(DefaultInterface.java:46)
    at java.net.NetworkInterface.<clinit>(NetworkInterface.java:65)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    ...


"Signal Dispatcher" Id=4 RUNNABLE


"Finalizer" Id=3 WAITING on java.lang.ref.ReferenceQueue$Lock@76ed5528
    at java.lang.Object.wait(Native Method)
    -  waiting on java.lang.ref.ReferenceQueue$Lock@76ed5528
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)


"Reference Handler" Id=2 WAITING on java.lang.ref.Reference$Lock@2c7b84de
    at java.lang.Object.wait(Native Method)
    -  waiting on java.lang.ref.Reference$Lock@2c7b84de
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:157)


"main" Id=1 RUNNABLE
    at sun.management.ThreadImpl.dumpThreads0(Native Method)
    at sun.management.ThreadImpl.dumpAllThreads(ThreadImpl.java:446)
    at RtTest.main(RtTest.java:35)


hhhhhhhhhh
oooooooo

區(qū)別:

  • 獲取不到Monitor和synchronizers鎖信息了。
  • Thread-0、Thread-2的堆棧信息(此時(shí)兩個(gè)線程正在運(yùn)行圆仔,持有了該鎖)垃瞧,不再顯示鎖信息。如下所示坪郭,缺少了lock
"Thread-0" Id=11 RUNNABLE
    at RtTest.processLock(RtTest.java:62)
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)

"Thread-0" Id=11 RUNNABLE
    at RtTest.processLock(RtTest.java:62)
    -  locked RtTest@76ed5528
    at RtTest$1.run(RtTest.java:17)
    at java.lang.Thread.run(Thread.java:745)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末个从,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子歪沃,更是在濱河造成了極大的恐慌嗦锐,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绸罗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡豆瘫,警方通過查閱死者的電腦和手機(jī)珊蟀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來外驱,“玉大人育灸,你說我怎么就攤上這事£怯睿” “怎么了磅崭?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瓦哎。 經(jīng)常有香客問我砸喻,道長(zhǎng),這世上最難降的妖魔是什么蒋譬? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任割岛,我火速辦了婚禮,結(jié)果婚禮上犯助,老公的妹妹穿的比我還像新娘癣漆。我一直安慰自己,他們只是感情好剂买,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布惠爽。 她就那樣靜靜地躺著,像睡著了一般瞬哼。 火紅的嫁衣襯著肌膚如雪婚肆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天坐慰,我揣著相機(jī)與錄音旬痹,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛两残,可吹牛的內(nèi)容都是我干的永毅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼人弓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼沼死!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崔赌,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤意蛀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后健芭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體县钥,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年慈迈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了若贮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痒留,死狀恐怖谴麦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伸头,我是刑警寧澤匾效,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站恤磷,受9級(jí)特大地震影響面哼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扫步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一精绎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锌妻,春花似錦代乃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吭历,卻和暖如春堕仔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晌区。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工摩骨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留通贞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓恼五,卻偏偏與公主長(zhǎng)得像昌罩,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灾馒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353