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

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