Multithreading Java线程转储:正在等待(在对象监视器上)-它在等待什么?

Multithreading Java线程转储:正在等待(在对象监视器上)-它在等待什么?,multithreading,jvm,thread-dump,Multithreading,Jvm,Thread Dump,有人问了一个类似的问题,但没有具体的答案,所以我会问我的问题,希望得到更多的信息 在下面的线程转储中,我看到线程处于“WAITING(on object monitor)”状态,但是没有一行带有“WAITING on”的代码表示它在等待什么。我如何解释这个线程堆栈并找出这个线程等待的原因(以及什么资源) "eventTaskExecutor-50" prio=10 tid=0x0000000004117000 nid=0xd8dd in Object.wait() [0x00007f8f457a

有人问了一个类似的问题,但没有具体的答案,所以我会问我的问题,希望得到更多的信息

在下面的线程转储中,我看到线程处于“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)
对象中的“eventTaskExecutor-50”优先级=10 tid=0x0000000004117000 nid=0xd8dd。等待()[0x00007f8f457ad000] java.lang.Thread.State:正在等待(在对象监视器上) 在java.lang.Object.wait(本机方法) 等待(Object.java:503) 位于com.tibco.tibjms.TibjmsxLink.sendRequest(TibjmsxLink.java:359) -锁定(com.tibco.tibjms.tibjmsx响应) 在com.tibco.tibjms.tibjmsxssessionimp.上进行确认交易(tibjmsxssessionimp.java:2934) 在com.tibco.tibjms.tibjmsxsessionmp.上确认(tibjmsxsessionmp.java:3333) -锁定(一个java.lang.Object) 在com.tibco.tibjms.tibjmsxssessionimp._commit(tibjmsxssessionimp.java:2666) 在com.tibco.tibjms.tibjmsxsessionmp.commit(tibjmsxsessionmp.java:4516)上 在org.springframework.jms.support.JmsUtils.commitifrequired上(JmsUtils.java:217) 位于org.springframework.jms.listener.AbstractMessageListenerContainer.CommitifEssential(AbstractMessageListenerContainer.java:577) 位于org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:482) 位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:325) 位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:263) 位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102) 位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:996) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 运行(Thread.java:722) 锁定可拥有的同步器: -(一个java.util.concurrent.ThreadPoolExecutor$Worker) 此线程是配置为接受来自Tibco总线的消息的侦听器线程之一

谢谢


玛丽娜

这是HotSpot JVM的一个特点。当转储堆栈时,JVM从方法局部变量恢复wait对象。此信息可用于解释的方法,但不适用于编译的本机包装器

Object.wait
执行得足够频繁时,它会被JIT编译。
在此之后,线程转储中将不再有“等待”行

  • 由于必须对
    synchronized
    对象调用
    wait()
    ,因此wait对象通常是堆栈跟踪中最后锁定的对象。在你的情况下是这样的

    - locked <0x00007f98cbebe5d8> (a com.tibco.tibjms.TibjmsxResponse)
    

  • 此线程正在等待由TIBCO EMS客户端库创建的另一个线程(线程名称为TCPLinkReader,如果您查看完整的线程转储,应该能够找到它)的通知

    stacktrace显示Spring应用程序正在尝试提交会话。要提交会话,EMS客户端需要向服务器发送一些数据,并等待服务器确认会话是否成功提交

    TCPLinkReader线程是EMS客户端用于接收下游(从服务器到客户端)TCP数据包的专用线程

    如果您看到此线程持续很长时间,则有两种情况:

    • EMS服务器端出现问题,可能挂起

    • 客户端库中存在一些导致死锁的缺陷,所以服务器确实发送了响应,但TCPLinkReader线程没有通知调用线程


    最后,如果问题仍然存在,请发布完整的线程转储。

    令人惊讶的是,我的线程转储中没有看到任何TCPLinkReader线程。。。然而,您对情况的评估似乎是正确的,因为我还怀疑我们看到的问题与Tibco总线的通信有关。。。谢谢你提供的信息@括号内的御风神与等待对象无关。0x00007f8f457ad000是给定线程的最后一个已知Java堆栈帧的地址。apangin,我可以知道为什么等待对象地址不是打印的顶行“object.wait()[0x00007f8f457ad000]”中的地址,也就是说它位于0x00007f8f457ad000吗?非常有用的意见。我有一个很好的JVM选项(-XX:CompileCommand=“exclude,java/lang/Object.wait”)
    -XX:CompileCommand="exclude,java/lang/Object.wait"