2014-09-06 56 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