2012-07-05 163 views
9

我有基於Java EE的應用程序在tomcat上運行,我看到突然間應用程序在運行幾個小時後掛起。分析java進程的線程轉儲

我收集了它掛起之前應用程序的線程轉儲,並把它放在TDA分析:

enter image description here

TDA(線程轉儲分析器)給出了上述監視器以下消息:

A lot of threads are waiting for this monitor to become available again. 
This might indicate a congestion. You also should analyze other locks 
blocked by threads waiting for this monitor as there might be much more 
threads waiting for it. 

這裏是上文所強調的線程的堆棧跟蹤:

"MY_THREAD" prio=10 tid=0x00007f97f1918800 nid=0x776a 
      waiting for monitor entry [0x00007f9819560000] 
    java.lang.Thread.State: BLOCKED (on object monitor) 
    at java.util.Hashtable.get(Hashtable.java:356) 
    - locked <0x0000000680038b68> (a java.util.Properties) 
    at java.util.Properties.getProperty(Properties.java:951) 
    at java.lang.System.getProperty(System.java:709) 
    at com.MyClass.myMethod(MyClass.java:344) 

我想知道"waiting for monitor entry"的狀態是什麼意思?也將不勝感激任何指針來幫助我調試此問題。

+4

我死鎖會緩存查找系統屬性,而不是像這樣重複地調用它們。在應用程序的整個生命週期中,您不需要調用System.getProperty()超過十幾次。即你應該編碼它,因爲它不是瓶頸。 – 2012-07-05 16:06:31

+0

嗯..好點的彼得! – peakit 2012-07-05 16:13:47

回答

1

Monitor = synchronized。你有很多線程試圖獲得同一個對象上的鎖。

也許你應該使用Hashtable的切換,並使用HashMap

+0

如果你看到我沒有直接使用'Hashtable'。它來自我對'System.getProperty()'的調用。有沒有一個非阻塞版本的'System.getProperty()'?謝謝! – peakit 2012-07-05 14:54:17

1

這意味着你的線程試圖設置鎖定(Hashtable中),但一些其他線程已訪問它,並設置鎖定。所以它正在等待鎖釋放。檢查你的其他線程正在做什麼。特別是線程與tid =「0x00007f9819560000」

+0

有趣的是,在線程轉儲文件中,我看不到有'tid = 0x00007f9819560000'的任何線程。任何想法? – peakit 2012-07-05 15:03:45

+0

嗯,可能是虛擬機監視器表鎖然後。沒有看到代碼,這將是艱難的。實質上,Hashtable正在兩個線程之間競爭。一種選擇可能是用HashMap替換Hashtable(因爲HashMap不是線程安全的)。我知道你正在使用Property,但只是複製到地圖中,然後使用地圖。所以你會看到它在爭用上爆發了(ConcurrentModificationException可能),或者它開始工作,因爲甚至不需要該鎖。 – mprivat 2012-07-05 16:17:48

5

其中一個線程獲取監視器對象(對象的排他鎖)。這意味着線程正在執行同步代碼,並且出於任何原因卡在那裏,可能正在等待其他線程。但是其他線程無法繼續執行,因爲它們遇到同步塊並要求鎖定(監視對象),但是直到它被其他線程釋放後才能得到它。所以......可能會陷入僵局。

2

請認準從整個主題此字符串轉儲

- 鎖定< 0x00007f9819560000>

如果你能找到它,線程是用絲線 「TID = 0x00007f97f1918800」

+0

是bobon,我在整個線程轉儲中搜索了這個字符串,除了問題中突出顯示的線程之外,找不到其他任何此id的引用。 – peakit 2012-07-05 15:33:32