У меня есть служба REST, созданная с использованием Jersey.
Когда я выполнял "завиток" для моего REST API, команда зависает.
Я запустил jstack, и это сводный вывод двух потоков в состоянии ЗАБЛОКИРОВАНО.
"pool-2-thread-11" prio=6 tid=0x01d51800 nid=0x2394
waiting for monitor entry [0x05e6f000..0x05e6fce8]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
DefaultImageProcessor.java:168)
- waiting to lock <0x257aa440>
(com.moi.ImageUriMutexImpl$MutexImpl)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
"pool-2-thread-10" prio=6 tid=0x01d51000 nid=0x18d0
waiting for monitor entry [0x05e1f000..0x05e1fd68]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.moi.DefaultImageProcessor$DownloadAndScaleCallable.call(
DefaultImageProcessor.java:168)
- waiting to lock <0x257aa6b8>
(com.moi.ImageUriMutexImpl$MutexImpl)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(
ThreadPoolExecutor.java:885)
Я хочу знать, как читать этот дамп стека. Какие признаки нужно искать в тупике?
ОБНОВЛЕНИЕ Я решил свою проблему! В основном я выполняю HttpClient 4.0 GET внутри синхронизированного блока. HttpClient вел себя плохо, не возвращался и держался за замки. Через jstack была пара потоков, удерживающих блокировки, которые вызвали указанную выше проблему. Теперь я понимаю, что это было не столько тупиков, сколько мои синхронизированные блоки возвращались слишком долго.