14

java-thread-dump-waiting-on-object-monitor-line-not-followed-by-waiting-onという同様の質問がありましたが、具体的な回答がなかったので、もっと得たいと思って質問します情報...

次のスレッド ダンプでは、スレッドが "WAITING (on object monitor)" 状態にあることがわかりますが、何を待っているかを示す "waiting on " の行はありません。このスレッド スタックを解釈し、このスレッドが待機している理由 (およびどのリソース) を調べるにはどうすればよいですか?

"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 バスからのメッセージを受け入れるように構成されたリスナー スレッドの 1 つです。

ありがとう!

マリーナ

4

2 に答える 2

19

これは HotSpot JVM の特徴です。スタックをダンプすると、JVM はメソッドのローカル変数から待機オブジェクトを回復します。この情報は、解釈されたメソッドで利用できますが、コンパイルされたネイティブ ラッパーでは利用できません。

Object.wait頻繁に実行されると、JIT コンパイルされます。その後、スレッド ダンプに「待機中」
の行は ありません。

  1. wait()オブジェクトで呼び出す必要があるためsynchronized、ほとんどの場合、待機オブジェクトはスタック トレースで最後にロックされたオブジェクトです。あなたの場合は

    - locked <0x00007f98cbebe5d8> (a com.tibco.tibjms.TibjmsxResponse)
    
  2. JIT コンパイルされないObject.waitようにする (したがって、待機情報を常に利用できるようにする) には、次の JVM オプションを使用します。

    -XX:CompileCommand="exclude,java/lang/Object.wait" 
    
于 2014-09-07T02:30:56.843 に答える