在看書的時候看到了一個觀察死鎖的工具TDA(Thread Dump Analysis)
看了半天,才知道這玩意兒需要由jvm產(chǎn)生一個Thread Dump
這個Thread Dump跟之前看到的Heap Dump也不是一回事
windows下是ctrl+break觸發(fā),unix下是ctrl+\或者kill -QUIT pid觸發(fā)
默認(rèn)是輸出到System.out,當(dāng)然,你可以重定向的
還有一個簡單方便快捷的方法:Java VisualVM,并且Java VisualVM中還提供了TDA的插件下載
太深入的現(xiàn)在還沒這水平,在之前的代碼調(diào)試中用了一下
之前的代碼中有這樣一個錯誤
很明顯,問題是鎖住了pool的固有鎖,然后等待
這是一個Java VisualVM的一個界面
只要簡單地點擊“線程 Dump”,就能得到一個線程Dump了,然后用TDA查看一下線程池0-9的狀態(tài)
可以看到,上鎖,然后等待,還有在這問題出現(xiàn)在哪一行,都明晰了
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ItEye推薦
看了半天,才知道這玩意兒需要由jvm產(chǎn)生一個Thread Dump
這個Thread Dump跟之前看到的Heap Dump也不是一回事
windows下是ctrl+break觸發(fā),unix下是ctrl+\或者kill -QUIT pid觸發(fā)
默認(rèn)是輸出到System.out,當(dāng)然,你可以重定向的
還有一個簡單方便快捷的方法:Java VisualVM,并且Java VisualVM中還提供了TDA的插件下載
太深入的現(xiàn)在還沒這水平,在之前的代碼調(diào)試中用了一下
之前的代碼中有這樣一個錯誤
void waitThread(Thread t) throws InterruptedException { synchronized(this) { freeThread.add((ThreadNode) t); busyThreadsNum.decrementAndGet(); synchronized(t) { t.wait(); } } }
很明顯,問題是鎖住了pool的固有鎖,然后等待
這是一個Java VisualVM的一個界面

只要簡單地點擊“線程 Dump”,就能得到一個線程Dump了,然后用TDA查看一下線程池0-9的狀態(tài)

可以看到,上鎖,然后等待,還有在這問題出現(xiàn)在哪一行,都明晰了
已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論
ItEye推薦