Java 6 JVM Hang - PullRequest
       30

Java 6 JVM Hang

4 голосов
/ 16 декабря 2008

Прошу прощения за длинный пост, но мне интересно, смогу ли я получить еще несколько замечаний по этому поводу, прежде чем отправлять сообщение об ошибке в Sun.

JVM: 6u11
O / S: Windows XP SP3
Аппаратное обеспечение: AMD Athlon 64 X2 4600+, 2,41 ГГц, с ОЗУ 3,25 ГБ.

Мне кажется, я столкнулся с ошибкой в ​​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 ]

2 голосов
/ 04 января 2009

Предоставленная трассировка потока завершена относительно рассматриваемой блокировки. Два других человека, с которыми я работаю, согласны с тем, что ошибка JVM четко указана, как и программисты в jProfiler (ej-technologies).

1 голос
/ 16 декабря 2008

Вы уверены, что поток RelayedMessages-0000000001 получает уведомление? Обычно другие потоки блокируются, поскольку первый поток все еще получает блокировку для <0x12a8f9f8>. Чтобы другие потоки могли получить блокировку, первый поток должен быть удален из списка ожидания и запланирован для повторного запуска, а затем снять полученную блокировку.

Может быть, есть другие потоки, ожидающие того же объекта, которого ожидает первый поток, и когда вы говорите уведомить, эти потоки выбраны для пробуждения. Если это возможно, обязательно используйте notifyAll ().

Также может быть, вы можете снять блокировку до помещения потока в список ожидания или ожидания вызова, указав значение тайм-аута. не имеет смысла, что поток находится в списке ожидания в течение 16 часов. Если вы также можете публиковать другие темы, это также будет полезно.

Обновление:

Вы правы, я должен был принять во внимание Thread.State. Как вы прокомментировали, он не находится в состоянии ожидания, так как он был уведомлен. Нахождение в списке ожидания не является причиной отказа от снятия блокировки <0x12a8f9f8>. Тем не менее, он находится в заблокированном состоянии. Это означает, что он пытается получить блокировку, полученную до object.wait, но не может. Похоже, что есть другой поток (не в том списке, который вы указали), блокирующий его.

Я думаю, вы думаете, object.wait должен был снять блокировку <0x12a8f9f8>. Но object.wait только снимает блокировку на этом объектном мониторе и сохраняет другие блокировки. И я думаю, что блокировка <0x12a8f9f8> не является блокировкой для монитора объекта (для которого вызывается ожидание)

Конечно, это может быть и не так, и может быть действительно ошибка. Я просто пытаюсь найти возможные причины.

...