Java 6 JVM Hang

为长篇文章道歉,但我想知道在向Sun提交错误报告之前是否可以对此进行更多关注。

JVM:6u11
操作系统:Windows XP SP3
硬件:AMD Athlon 64 X2 4600+ @ 2.41GHz,内存3.25 GB。

我相信我在JVM中遇到了一个错误,其中没有给出监视器的线程。 在以下线程跟踪中,监视器RelayedMessages-0000000001获取,最终等待它; 该线程随后得到通知。 但是,即使列出的所有线程都在竞争监视器,也没有人获得它。

我保证每个引用monitor 的线程都完成了线程转储。 转储是使用Java VisualVM获得的,在16个小时的时间内获得三次,并且每次都显示为一致(这些线程未更改)。

是否有人不同意我的评估,即JVM无法将监视器交付给任何符合条件的线程,何时应将其交付给其中一个?

 "RelayedMessages-0000000001" daemon prio=6 tid=0x03694400 nid=0x1750 waiting for monitor entry [0x05e1f000..0x05e1fc94] java.lang.Thread.State: BLOCKED (on object monitor) at java.lang.Object.wait(Native Method) at com.companyremoved.thd.EzWaiter.ezWait(EzWaiter.java:249) - locked  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.waitWithinMessage(IsolatedObject.java:352) - locked  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.system.coms.ComsSender.waitForAvailablePipe(ComsSender.java:219) at com.companyremoved.system.coms.ComsSender.sendObject(ComsSender.java:185) at com.companyremoved.system.coms.ComsSender.processIocMessage(ComsSender.java:98) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:311) - locked  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.iocMessage(IsolatedObject.java:265) at com.companyremoved.ioc.IocTarget.iocMessage(IocTarget.java:138) at com.companyremoved.ioc.IocBinding.iocMessage(IocBinding.java:105) at com.companyremoved.system.coms.ComsSender$Messages.sendObject(ComsSender.java:333) at com.companyremoved.system.coms.ComsSender$Messages.sendObject(ComsSender.java:316) at com.companyremoved.system.coms.RelayedMessage.run(RelayedMessage.java:104) - locked  (a com.companyremoved.system.coms.RelayedMessage) at com.companyremoved.thd.RunQueue.runEntry(RunQueue.java:293) at com.companyremoved.thd.RunQueue.run(RunQueue.java:273) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "ScbPipe Writer" daemon prio=6 tid=0x4fff0c00 nid=0xf14 waiting for monitor entry [0x0594f000..0x0594fc14] java.lang.Thread.State: BLOCKED (on object monitor) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:293) - waiting to lock  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.iocMessage(IsolatedObject.java:265) at com.companyremoved.ioc.IocTarget.iocMessage(IocTarget.java:138) at com.companyremoved.coms.stm.ioc.ComsPipe$Receiver.scbPipeDefaultProcessor(ComsPipe.java:403) at com.companyremoved.scb.ScbPipe.processObject(ScbPipe.java:915) - locked  (a java.lang.Object) at com.companyremoved.scb.ScbPipe.writerRun(ScbPipe.java:817) at com.companyremoved.scb.ScbPipe.run(ScbPipe.java:728) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "ScbPipe Writer" daemon prio=6 tid=0x4c647400 nid=0xe00 waiting for monitor entry [0x059ef000..0x059efb94] java.lang.Thread.State: BLOCKED (on object monitor) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:293) - waiting to lock  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.iocMessage(IsolatedObject.java:265) at com.companyremoved.ioc.IocTarget.iocMessage(IocTarget.java:138) at com.companyremoved.coms.stm.ioc.ComsPipe$Receiver.scbPipeDefaultProcessor(ComsPipe.java:403) at com.companyremoved.scb.ScbPipe.processObject(ScbPipe.java:915) - locked  (a java.lang.Object) at com.companyremoved.scb.ScbPipe.writerRun(ScbPipe.java:817) at com.companyremoved.scb.ScbPipe.run(ScbPipe.java:728) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "ScbPipe Writer" daemon prio=6 tid=0x035f7800 nid=0x1130 waiting for monitor entry [0x0726f000..0x0726fc94] java.lang.Thread.State: BLOCKED (on object monitor) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:293) - waiting to lock  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.iocMessage(IsolatedObject.java:265) at com.companyremoved.ioc.IocTarget.iocMessage(IocTarget.java:138) at com.companyremoved.coms.stm.ioc.ComsPipe$Receiver.scbPipeDefaultProcessor(ComsPipe.java:403) at com.companyremoved.scb.ScbPipe.processObject(ScbPipe.java:915) - locked  (a java.lang.Object) at com.companyremoved.scb.ScbPipe.writerRun(ScbPipe.java:817) at com.companyremoved.scb.ScbPipe.run(ScbPipe.java:728) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None "IOC Signals-0000000001" daemon prio=6 tid=0x03673000 nid=0x1434 waiting for monitor entry [0x0415f000..0x0415fd94] java.lang.Thread.State: BLOCKED (on object monitor) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:293) - waiting to lock  (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.iocMessage(IsolatedObject.java:265) at com.companyremoved.ioc.IocTarget.iocMessage(IocTarget.java:138) at com.companyremoved.ioc.IocBinding.iocMessage(IocBinding.java:105) at com.companyremoved.system.coms.ComsSender$Messages.removePipe(ComsSender.java:302) at com.companyremoved.system.coms.ConnectionController.disconnect(ConnectionController.java:712) at com.companyremoved.system.coms.ConnectionController.shutdown(ConnectionController.java:224) at com.companyremoved.system.coms.ConnectionController.processIocMessage(ConnectionController.java:168) at com.companyremoved.ioc.IsolatedObject.deliver(IsolatedObject.java:311) - locked  (a com.companyremoved.system.coms.ConnectionController) at com.companyremoved.ioc.IsolatedObject.access$100(IsolatedObject.java:36) at com.companyremoved.ioc.IsolatedObject$SignalProxy.run(IsolatedObject.java:526) at com.companyremoved.thd.RunQueue.runEntry(RunQueue.java:293) at com.companyremoved.thd.RunQueue.run(RunQueue.java:273) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None 

提供的线程跟踪相对于所讨论的锁完成。 与我合作的另外两个人同意明确指出JVM故障,jProfiler(ej-technologies)的程序员也是如此。

你确定通知线程RelayedMessages-0000000001? 由于第一个线程仍然获得<0x12a8f9f8>的锁定,因此阻塞其他线程是正常的。 为了能够获得其他线程的锁定,应该从等待列表中删除第一个线程并安排再次运行,然后释放它获得的锁定。

可能有其他线程正在等待第一个线程等待的同一个对象,当你说通知那些线程被选中唤醒时。 如果可以,请确保使用notifyAll()。

也可以在将线程放入等待列表之前释放锁定,或者通过给出超时值来调用等待。 线程在等待列表中持续16个小时是没有意义的。 如果您还可以发布其他有用的线程。

更新:

你是对的,我应该考虑Thread.State。 正如您所评论的那样,它已处于通知状态,因此未处于等待状态。 处于等待列表不是没有释放锁<0x12a8f9f8>的原因,然后。 但是,它处于阻塞状态。 这意味着,它试图获取它在object.wait之前获得的锁,但它不能。 因此,似乎还有另一个线程(不在您提供的列表中)阻止它。

我想,你在想object.wait应该已经释放了锁<0x12a8f9f8>。 但是object.wait只释放该对象监视器上的锁并保留其他锁。 我认为,lock <0x12a8f9f8>不是对象监视器的锁(为其调用wait)

当然也可能不是这样,并且可能存在一个真正的错误。 我只想提出可能的理由。