В моей самой загруженной производственной установке иногда я получаю один поток, который кажется застрявшим в бесконечной петле. Мне не удалось выяснить, кто является виновником, после долгих исследований и отладки, но кажется, что это должно быть возможно. Вот кровавые детали:
Текущие примечания по отладке:
1) ps -eL 18975 показывает мне pid Linux, проблемный дочерний поток, 19269
$ps -eL | grep 18975
...
PID LWP TTY TIME CMD
18975 18994 ? 00:00:05 java
18975 19268 ? 00:00:00 java
18975 19269 ? 05:16:49 java
18975 19271 ? 00:01:22 java
18975 19273 ? 00:00:00 java
...
2) jstack -l 18975 говорит, что нет взаимоблокировок, jstack -m 18975 не работает
3) jstack -l 18975 дает мне трассировку стека для всех моих потоков (~ 400). Пример стека потоков ( и не проблема ):
"http-342.877.573.944-8080-360" daemon prio=10 tid=0x0000002adaba9c00 nid=0x754c in Object.wait() [0x00000000595bc000..0x00000000595bccb0]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at java.lang.Object.wait(Object.java:485)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416)
- locked (a org.apache.tomcat.util.net.JIoEndpoint$Worker)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442)
at java.lang.Thread.run(Thread.java:619)
4) Идентификатор потока вывода ps -eL не совпадает с выводом из jstack, или, по крайней мере, я его не вижу. (документация jstack немного скудна.)
5) Не требуется интенсивного ввода-вывода, использования памяти или других соответствующих подсказок для работы.
Платформа:
- Java 6
- Tomcat 6
- RHEL 4 (64-разрядная версия)
Кто-нибудь знает, как я могу установить это соединение из вывода linux ps в мой проблемный дочерний поток Java? Так близко, но так далеко ...