2014-09-06 53 views
5

有一個類似的問題問java-thread-dump-waiting-on-object-monitor-line-not-followed-by-waiting-on,但沒有具體的答案,所以我會問我的問題,希望得到更多的信息.​​..Java線程轉儲:WAITING(在對象監視器上) - 它在等什麼?

在下面的線程轉儲我看到線程處於「等待(在對象監視器上)「狀態 - 但是沒有等待」等待「的線路表明它正在等待什麼。我如何解釋這個線程棧並找出這個線程正在等待的原因(以及哪些資源)?

"eventTaskExecutor-50" prio=10 tid=0x0000000004117000 nid=0xd8dd in Object.wait() [0x00007f8f457ad000] 
java.lang.Thread.State: WAITING (on object monitor) 
at java.lang.Object.wait(Native Method) 
at java.lang.Object.wait(Object.java:503) 
at com.tibco.tibjms.TibjmsxLink.sendRequest(TibjmsxLink.java:359) 
- locked <0x00007f98cbebe5d8> (a com.tibco.tibjms.TibjmsxResponse) 
at com.tibco.tibjms.TibjmsxSessionImp._confirmTransacted(TibjmsxSessionImp.java:2934) 
at com.tibco.tibjms.TibjmsxSessionImp._confirm(TibjmsxSessionImp.java:3333) 
- locked <0x00007f90101399b8> (a java.lang.Object) 
at com.tibco.tibjms.TibjmsxSessionImp._commit(TibjmsxSessionImp.java:2666) 
at com.tibco.tibjms.TibjmsxSessionImp.commit(TibjmsxSessionImp.java:4516) 
at org.springframework.jms.support.JmsUtils.commitIfNecessary(JmsUtils.java:217) 
at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:577) 
at org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:482) 
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) 
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) 
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102) 
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:996) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:722) 

Locked ownable synchronizers: 
- <0x00007f901011ca88> (a java.util.concurrent.ThreadPoolExecutor$Worker) 

此線程是配置爲接受來自Tibco總線的消息的監聽線程之一。

謝謝!

Marina

回答

7

這是HotSpot JVM的一個特點。轉儲堆棧時,JVM從方法局部變量中恢復等待對象。此信息可用於解釋的方法,但不適用於編譯的本機包裝。

Object.wait執行得不夠頻繁時,它會得到JIT編譯。
之後,將不存在「正在等待」線程轉儲中的行。

  1. 由於wait()必須被稱爲​​對象上,最常見的等待對象是在堆棧跟蹤最後鎖定的對象。在你的情況下,它是

    - locked <0x00007f98cbebe5d8> (a com.tibco.tibjms.TibjmsxResponse) 
    
  2. 爲了防止Object.wait被JIT編譯(並因此使等待信息總是可用)請使用以下JVM選項

    -XX:CompileCommand="exclude,java/lang/Object.wait" 
    
+0

這是很棒的信息 - 謝謝你,apangin! – Marina 2014-09-07 14:12:41

1

這個線程正在等待來自另一個線程的通知(線程名稱是TCPLinkReader,如果您查看完整的線程轉儲,您應該能夠找到它)由TIBCO EMS客戶端庫創建。

stacktrace顯示Spring應用程序正在嘗試提交會話。要提交會話,EMS客戶端需要向服務器發送一些數據,並等待服務器確認會話成功提交或不提交。

TCPLinkReader線程是EMS客戶端用來接收下游(從服務器到客戶端)TCP數據包的專用線程。

如果您看到這個線程持續時間不長,有2種情況:

  • 東西錯了就EMS服務器端,可能掛

  • 有客戶端庫的一些缺陷,即導致死鎖,所以服務器確實發送了迴應,但TCPLinkReader線程沒有通知調用者線程。

最後,如果問題仍然存在,請發佈完整線程轉儲。

+0

令人驚訝的是,我沒有看到任何TCPLinkReader線程在我的線程中轉儲...但是,您對情況的評估似乎是正確的,因爲我也懷疑我們看到的問題與他與Tibco總線的通信有關。 。謝謝你的信息! – Marina 2014-09-19 19:42:50