有一个类似的问题问java-thread-dump-waiting-on-object-monitor-line-not-followed-by-waiting-on,但是没有具体的答案,所以我会问我的问题,希望能获得更多的信息...
在下面的线程转储中,我看到线程处于“ WAITING(在对象监视器上)”状态-但是没有“ 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总线的消息的侦听器线程之一。
谢谢!
码头
最佳答案
这是HotSpot JVM的独特之处。转储堆栈时,JVM从方法局部变量恢复等待对象。此信息可用于解释方法,但不适用于已编译的本地包装器。
当Object.wait
执行得足够频繁时,它将被JIT编译。
之后,线程转储中将不再有任何``waiting on''行。
由于必须在wait()
对象上调用synchronized
,因此大多数情况下,等待对象是堆栈跟踪中的最后一个锁定对象。你的情况是
- locked <0x00007f98cbebe5d8> (a com.tibco.tibjms.TibjmsxResponse)
为防止
Object.wait
进行JIT编译(从而使等待信息始终可用),请使用以下JVM选项-XX:CompileCommand="exclude,java/lang/Object.wait"