#java #multithreading #aem
#java #многопоточность #aem
Вопрос:
Я получил доступ к дампу потока промежуточного веб-сервера, на котором несколько потоков ожидают разные объекты. Один поток таймера имеет доступ к объекту 0x13e30613 и ожидает 0x2fa1056c.
"Timer-17637" prio=5 tid=0x75e4 nid=0xffffffff in Object.wait()
java.lang.Thread.State: WAITING (on object monitor)
at java.base@11.0.8/jdk.internal.misc.Unsafe.park(Native Method)
- waiting to lock <0x2fa1056c> (a java.util.concurrent.CountDownLatch$Sync) owned by "null" tid=0x-1
at java.base@11.0.8/java.util.concurrent.locks.LockSupport.park(LockSupport.java:194)
.....
.....
- locked <0x13e30613> (a java.lang.Object)
at java.base@11.0.8/java.util.TimerThread.mainLoop(Timer.java:556)
at java.base@11.0.8/java.util.TimerThread.run(Timer.java:506)
Но в потоке не указано, какой поток заблокировал объект 0x2fa1056c. Ни в одном другом стеке потоков ничего не упоминается об объекте 0x2fa1056c. Большинство других потоков ожидают объект 0x13e30613, удерживаемый потоком таймера, что вызывает ситуацию, подобную взаимоблокировке. Как мне определить, какому потоку принадлежит объект 0x2fa1056c?
ОТРЕДАКТИРОВАНО: Gist, содержащий журналы https://gist.github.com/riteshksriv/3b249eb56e0500a9234cd2470152d730
Комментарии:
1. В чем именно ваша проблема
2. @akortex91 ну, в вопросе уже упоминается об этом: на одном объекте есть блокировка, которую ожидает поток центрального таймера. Однако это
owned by "null" tid=0x-1
указывает на то, что нет потока, владеющего блокировкой, поэтому вопрос в том, как выяснить, кто удерживает эту блокировку, чтобы эту ситуацию можно было исправить / предотвратить.3. Показывает ли ваш stacktrace какие-либо
blocked
потоки?4. @akortex91 Да. Все потоки, ожидающие 0x13e30613, находятся в ЗАБЛОКИРОВАННОМ состоянии
5. Кроме того, поток таймера находится в состоянии ОЖИДАНИЯ