亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java線程Dump分析工具jstack解析及使用場景

2024-07-13 10:15:47
字體:
來源:轉載
供稿:網友

jstack用于打印出給定的java進程ID或core file或遠程調試服務的Java堆棧信息,如果是在64位機器上,需要指定選項"-J-d64",Windows的jstack使用方式只支持以下的這種方式:

jstack [-l][F] pid

如果java程序崩潰生成core文件,jstack工具可以用來獲得core文件的java stack和native stack的信息,從而可以輕松地知道java程序是如何崩潰和在程序何處發生問題。另外,jstack工具還可以附屬到正在運行的java程序中,看到當時運行的java程序的java stack和native stack的信息, 如果現在運行的java程序呈現hung的狀態,jstack是非常有用的。進程處于hung死狀態可以用-F強制打出stack。

dump 文件里,值得關注的線程狀態有:

死鎖,Deadlock(重點關注)

執行中,Runnable

等待資源,Waiting on condition(重點關注)

等待獲取監視器,Waiting on monitor entry(重點關注)

暫停,Suspended

對象等待中,Object.wait() 或 TIMED_WAITING

阻塞,Blocked(重點關注)

停止,Parked

在摘了另一篇博客的三種場景:

實例一:Waiting to lock 和 Blocked

"RMI TCP Connection(267865)-172.16.5.25" daemon prio=10 tid=0x00007fd508371000 nid=0x55ae waiting for monitor entry [0x00007fd4f8684000]  java.lang.Thread.State: BLOCKED (on object monitor)at org.apache.log4j.Category.callAppenders(Category.java:201)- waiting to lock <0x00000000acf4d0c0> (a org.apache.log4j.Logger)at org.apache.log4j.Category.forcedLog(Category.java:388)at org.apache.log4j.Category.log(Category.java:853)at org.apache.commons.logging.impl.Log4JLogger.warn(Log4JLogger.java:234)at com.tuan.core.common.lang.cache.remote.SpyMemcachedClient.get(SpyMemcachedClient.java:110)

說明:

1)線程狀態是 Blocked,阻塞狀態。說明線程等待資源超時!

2)“ waiting to lock <0x00000000acf4d0c0>”指,線程在等待給這個 0x00000000acf4d0c0 地址上鎖(英文可描述為:trying to obtain 0x00000000acf4d0c0 lock)。

3)在 dump 日志里查找字符串 0x00000000acf4d0c0,發現有大量線程都在等待給這個地址上鎖。如果能在日志里找到誰獲得了這個鎖(如locked < 0x00000000acf4d0c0 >),就可以順藤摸瓜了。

4)“waiting for monitor entry”說明此線程通過 synchronized(obj) {……} 申請進入了臨界區,從而進入了下圖1中的“Entry Set”隊列,但該 obj 對應的 monitor 被其他線程擁有,所以本線程在 Entry Set 隊列中等待。

5)第一行里,"RMI TCP Connection(267865)-172.16.5.25"是 Thread Name 。tid指Java Thread id。nid指native線程的id。prio是線程優先級。[0x00007fd4f8684000]是線程棧起始地址。

實例二:Waiting on condition 和 TIMED_WAITING

"RMI TCP Connection(idle)" daemon prio=10 tid=0x00007fd50834e800 nid=0x56b2 waiting on condition [0x00007fd4f1a59000]  java.lang.Thread.State: TIMED_WAITING (parking)at sun.misc.Unsafe.park(Native Method)- parking to wait for <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:198)at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:424)at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:323)at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:874)at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)at java.lang.Thread.run(Thread.java:662)

說明:

1)“TIMED_WAITING (parking)”中的 timed_waiting 指等待狀態,但這里指定了時間,到達指定的時間后自動退出等待狀態;parking指線程處于掛起中。

2)“waiting on condition”需要與堆棧中的“parking to wait for <0x00000000acd84de8> (a java.util.concurrent.SynchronousQueue$TransferStack)”結合來看。首先,本線程肯定是在等待某個條件的發生,來把自己喚醒。其次,SynchronousQueue 并不是一個隊列,只是線程之間移交信息的機制,當我們把一個元素放入到 SynchronousQueue 中時必須有另一個線程正在等待接受移交的任務,因此這就是本線程在等待的條件。

3)別的就看不出來了。

實例三:in Obejct.wait() 和 TIMED_WAITING

"RMI RenewClean-[172.16.5.19:28475]" daemon prio=10 tid=0x0000000041428800 nid=0xb09 in Object.wait() [0x00007f34f4bd0000]  java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(Native Method)- waiting on <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)- locked <0x00000000aa672478> (a java.lang.ref.ReferenceQueue$Lock)at sun.rmi.transport.DGCClient$EndpointEntry$RenewCleanThread.run(DGCClient.java:516)at java.lang.Thread.run(Thread.java:662)

說明:

1)“TIMED_WAITING (on object monitor)”,對于本例而言,是因為本線程調用了 java.lang.Object.wait(long timeout) 而進入等待狀態。

2)“Wait Set”中等待的線程狀態就是“ in Object.wait() ”。當線程獲得了 Monitor,進入了臨界區之后,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了 Monitor,進入 “Wait Set”隊列。只有當別的線程在該對象上調用了 notify() 或者 notifyAll() ,“ Wait Set”隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的 Monitor,恢復到運行態。

3)RMI RenewClean 是 DGCClient 的一部分。DGC 指的是 Distributed GC,即分布式垃圾回收。

4)請注意,是先 locked <0x00000000aa672478>,后 waiting on <0x00000000aa672478>,之所以先鎖再等同一個對象,請看下面它的代碼實現:

static private class Lock { };private Lock lock = new Lock();public Reference<? extends T> remove(long timeout){  synchronized (lock) {    Reference<? extends T> r = reallyPoll();    if (r != null) return r;    for (;;) {      lock.wait(timeout);      r = reallyPoll();      ……    }}

即,線程的執行中,先用 synchronized 獲得了這個對象的 Monitor(對應于 locked <0x00000000aa672478> );當執行到 lock.wait(timeout);,線程就放棄了 Monitor 的所有權,進入“Wait Set”隊列(對應于 waiting on <0x00000000aa672478> )。

5)從堆棧信息看,是正在清理 remote references to remote objects ,引用的租約到了,分布式垃圾回收在逐一清理呢。

總結

以上就是本文關于Java線程Dump分析工具jstack解析及使用場景的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频福利一区| 亚洲午夜激情免费视频| 国产成人午夜视频网址| 亚洲第一区第二区| 欧美日韩在线观看视频| 国产精品丝袜久久久久久高清| 久久九九热免费视频| 久久精品久久久久久国产 免费| 高清欧美性猛交xxxx黑人猛交| 97久久精品在线| 欧美精品aaa| 欧美日韩人人澡狠狠躁视频| 亚洲区bt下载| 国产成人免费av电影| 欧洲美女免费图片一区| 亚洲欧洲日本专区| 国产精品h片在线播放| 日日噜噜噜夜夜爽亚洲精品| 九九热r在线视频精品| 国产精品视频999| 91久久久久久| 日韩成人在线播放| 久久综合国产精品台湾中文娱乐网| 国产精品∨欧美精品v日韩精品| 自拍视频国产精品| 免费成人高清视频| 97视频在线观看网址| 日韩最新免费不卡| 国产日韩欧美中文| 亚洲欧美自拍一区| 亚洲精品国产综合久久| 国产91精品网站| 国产成人在线一区| 成人精品久久一区二区三区| 日韩精品极品在线观看| 国产脚交av在线一区二区| 色妞色视频一区二区三区四区| 欧美在线视频在线播放完整版免费观看| 日韩av免费看网站| 亚洲人成电影网| 日韩视频免费观看| 国产午夜精品久久久| 日韩在线免费视频观看| 久久久久免费精品国产| 国产精品1区2区在线观看| 国产精品丝袜白浆摸在线| 91亚洲va在线va天堂va国| 欧美日韩亚洲系列| 欧美在线一级视频| 国产午夜精品视频| 欧美日本高清一区| 98精品国产自产在线观看| 欧美精品免费在线| 久久精品2019中文字幕| 亚洲www永久成人夜色| 欧美精品videos性欧美| 久久精品视频播放| 亚洲欧美日韩精品| 亚洲国产精品va在看黑人| 美女视频黄免费的亚洲男人天堂| www.日韩欧美| 欧美性猛交视频| 亚洲人成网站777色婷婷| 91精品国产高清自在线| 国产精品久久久久久av下载红粉| 亚洲免费成人av电影| 色综合天天综合网国产成人网| 国产精品专区h在线观看| 国产在线不卡精品| 日本韩国欧美精品大片卡二| 亚洲午夜国产成人av电影男同| 久久理论片午夜琪琪电影网| 欧美电影在线观看高清| 在线观看视频亚洲| 人人澡人人澡人人看欧美| 欧美丰满少妇xxxxx做受| 91免费视频国产| 一区二区在线视频播放| 亚洲精品国产综合久久| 午夜精品国产精品大乳美女| 精品免费在线视频| 国产精品美女久久久免费| 成人妇女淫片aaaa视频| 97高清免费视频| 91精品综合久久久久久五月天| 92福利视频午夜1000合集在线观看| 91精品久久久久久久久不口人| 欧美电影免费观看| 欧美成人亚洲成人日韩成人| 欧美另类极品videosbestfree| 日韩精品免费视频| 日韩精品极品视频| 欧美日韩一区二区免费视频| 欧美性猛交xxxx黑人| 欧美夫妻性视频| 亚洲色图综合久久| 国产精品久久久av久久久| 国产一区二区三区在线免费观看| www.日韩av.com| 亚洲精品videossex少妇| 亚洲图片在区色| 欧美色图在线视频| 日韩大片在线观看视频| 亚洲欧美日韩天堂| 欧美日韩成人在线视频| 亚洲欧美另类在线观看| 久久激情五月丁香伊人| 亚洲视频在线看| 久久精品美女视频网站| 国模极品一区二区三区| 欧美日韩美女在线| 欧美日韩电影在线观看| 国产最新精品视频| 日韩视频免费看| 亚洲国产另类 国产精品国产免费| 97视频国产在线| 国产精品久久久久久婷婷天堂| 国产日韩av在线| 久久97久久97精品免视看| 欧美成人一区在线| 国产欧美一区二区三区在线| 九九九热精品免费视频观看网站| 夜夜躁日日躁狠狠久久88av| 日本一欧美一欧美一亚洲视频| 亚洲精品国精品久久99热| 国产成人自拍视频在线观看| 91精品国产91久久久久久最新| 亚洲电影av在线| 久久久久国色av免费观看性色| 久久精品视频导航| 国内精品久久久久久久久| 日韩中文有码在线视频| 国产成人鲁鲁免费视频a| 国产日本欧美一区二区三区| 成人综合网网址| 亚洲图片在线综合| 亚洲iv一区二区三区| 日韩欧美高清视频| 久久免费国产视频| 日韩av网站大全| 欧美日韩中文字幕在线视频| 国产性猛交xxxx免费看久久| 欧美精品免费看| 91色琪琪电影亚洲精品久久| 青青精品视频播放| 精品国产一区二区三区在线观看| 欧美日韩国产丝袜另类| 国产成人高清激情视频在线观看| 亚洲第一页中文字幕| 中文字幕欧美日韩在线| 91在线|亚洲| 久久久之久亚州精品露出| 亚洲福利视频免费观看| 91国产在线精品| 亚洲无线码在线一区观看| 亚洲精品久久久久中文字幕欢迎你| 韩国v欧美v日本v亚洲| 在线观看久久久久久| 亚洲欧美精品伊人久久| 国产精品福利在线观看| 亚洲free嫩bbb| 国产成人精彩在线视频九色| 欧美又大又硬又粗bbbbb| 精品高清一区二区三区|