2015-05-22 50 views
0

我們可以重現您的系統部分死機的情況。我們懷疑這可能是由於鎖定問題。在Java應用程序中查找死鎖的原因的工具

我們如何才能找出我們應用程序的每個線程當前所處的位置?我們可以使用哪種工具找到發生死鎖的位置?

+0

在這個http://stackoverflow.com/questions/8942658/static-analysis-tool-to-detect-multithreading-problems-deadlocks-race-conditio –

+1

看看從jstack開始。 –

+0

如果它是一個Web應用程序,你可以使用瀏覽器調試工具,否則嘗試在你認爲可能發生死鎖的每個地方添加註釋,並通過它們追蹤以找到問題的根源 – BhandariS

回答

1

您需要執行正在運行的進程的線程轉儲才能看到當時運行的所有線程的堆棧跟蹤。

在5-10秒的時間間隔內執行多個線程轉儲是一個好主意,以便您可以比較不同轉儲中線程的活動。

有多種方法使應用程序的線程轉儲:

  1. 如果你已經在那裏進程正在運行的機器上jstack,

    jstack {pid} > threaddump.log 
    
  2. 殺-3 {} PID

  3. 使用jvisiualvm或jconsole,您可以連接到本地/遠程進程並生成threaddump

0

如果你想找到導致死鎖的線程,你可以使用ThreadMXBean。 這裏是如何做到這一點很好的例子:

deadlock detection using ThreadMXBean

而且,這裏是Oracle山楂鏈接使用jstack。 Jstack可能更有用的給你,因爲它會告訴你哪些線程等待資源,其資源,它還會告訴你哪個線程佔用資源:

oracle docs link

2

你可以使用jstack實用程序,它顯示java進程的堆棧跟蹤。您可以在JDK的bin目錄中找到它。請參閱the documentation

2

Adquire一個threaddump(JConsole的,殺-3 PID等),如果你想用一個圖形顯示一些與Samurai

1

分析它,你可以使用JProfiler,其鎖定圖表顯示紅色死鎖:

enter image description here

它還允許您分析一段時間的鎖定情況。

免責聲明:我公司開發的JProfiler

相關問題