Зависание Java 6 JVM

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

JVM: 6u11
Операционная система: 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

Просто чтобы убедиться: вы нигде не используете Thread.suspend?

Tom Hawtin - tackline 16.12.2008 17:04

Справедливый вопрос. Ответ: абсолютно нет. И ни Thread.stop (), ни какой-либо другой устаревший метод.

Lawrence Dol 16.12.2008 22:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
4 583
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

Обновлять:

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

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

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

Если бы он не был уведомлен, он (а) все еще был бы в состоянии WAIT и (б) он не мешал бы другим потокам получить монитор.

Lawrence Dol 16.12.2008 12:47

У него есть тайм-аут в вызове ожидания (30000 мс). И он использует notifyAll. И если поток ожидает <0x12a8f9f8>, то он освободил монитор.

Lawrence Dol 16.12.2008 12:50

Как уже говорилось, я опубликовал все темы, где упоминается <0x12a8f9f8>; это тот монитор, который несколько потоков ожидает получения, но который ни один из них не получает и ни один из них не заблокирован.

Lawrence Dol 16.12.2008 12:51

Проблема в том, что несколько потоков пытаются получить <0x12a8f9f8>, но ни один из них не получает его; так или иначе, авторы jProfiler приняли полный захват, который я им предоставил, как доказательство ошибки либо в JProfiler, либо в JVM.

Lawrence Dol 02.01.2009 00:56
Ответ принят как подходящий

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

Другие вопросы по теме