代码之家  ›  专栏  ›  技术社区  ›  L. Cornelius Dol

Java 6 JVM挂起

  •  4
  • L. Cornelius Dol  · 技术社区  · 17 年前

    对于这么长的帖子,我深表歉意,但我想知道在我向Sun提交错误报告之前,我是否能得到更多的关注。

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

    我想我在JVM中遇到了一个错误,没有给线程一个监视器。在以下线程跟踪中,监视器 <0x12a8f9f8> 被收购 RelayedMessages-0000000001 ,最终等待它;该线程随后被通知。然而,尽管列出的所有线程都在争夺监视器,但没有一个线程能得到它。

    我保证,对于引用监视器的每个线程,线程转储都是完整的 <0x12a8f9f8>; 转储是使用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 <0x12a8f9f8> (a com.companyremoved.system.coms.ComsSender)
        at com.companyremoved.ioc.IsolatedObject.waitWithinMessage(IsolatedObject.java:352)
        - locked <0x12a8f9f8> (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 <0x12a8f9f8> (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 <0x130fe8e0> (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 <0x12a8f9f8> (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 <0x131a4ea0> (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 <0x12a8f9f8> (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 <0x13188bb8> (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 <0x12a8f9f8> (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 <0x12a8a478> (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 <0x12a8f9f8> (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 <0x12a8b798> (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
    
    2 回复  |  直到 17 年前
        1
  •  2
  •   L. Cornelius Dol    17 年前

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

        2
  •  1
  •   hakan    17 年前

    您确定已通知线程RelayedMessages-0000000001吗?其他线程被阻塞是正常的,因为第一个线程仍然获得<0x12a8f9f8>;为了使其他线程能够获得锁,应将第一个线程从等待列表中删除,并计划再次运行,然后释放它获得的锁。

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

    也可以在将线程放入等待列表之前释放锁,或者通过给出超时值来调用wait。线程在等待列表中等待16小时是没有意义的。如果你也能发布其他帖子,那也会很有帮助。

    更新:

    你说得对,我应该考虑一下线索。国家。正如您所评论的,由于已收到通知,因此它不处于等待状态。在等待名单中不是不解锁的原因<0x12a8f9f8>;那么。然而,它处于阻塞状态。这意味着,它正在尝试获取在object.wait之前获得的锁,但它不能。因此,似乎有另一个线程(不在您提供的列表中)阻止了它。

    我想,你在想对象。wait应该把锁打开<0x12a8f9f8>;.但是object.wait只释放该对象监视器上的锁,并保留其他锁。我想,锁<0x12a8f9f8>;不是对象监视器的锁(需要等待)

    当然,情况可能并非如此,而且可能存在真正的错误。我只是想找出可能的原因。

    推荐文章