最も負荷の高い実稼働インストールでは、無限ループに陥ったように見える単一のスレッドが発生することがあります。多くの調査とデバッグを行った後、犯人が誰であるかを突き止めることはできませんでしたが、それは可能であるように思われます. 悲惨な詳細は次のとおりです。
現在のデバッグに関する注意事項:
1) ps -eL 18975は、問題の子スレッドである Linux pid 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" デーモン prio=10 tid=0x0000002adaba9c00 nid=0x754c in Object.wait() [0x00000000595bc000..0x00000000595bccb0] java.lang.Thread.State: WAITING (オブジェクトモニター上) at java.lang.Object.wait(ネイティブメソッド) - 待機中 (org.apache.tomcat.util.net.JIoEndpoint$Worker) java.lang.Object.wait(Object.java:485) で org.apache.tomcat.util.net.JIoEndpoint$Worker.await(JIoEndpoint.java:416) で - ロック済み (org.apache.tomcat.util.net.JIoEndpoint$Worker) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:442) で java.lang.Thread.run(Thread.java:619) で
4) ps -eL 出力のスレッド ID が jstack からの出力と一致しないか、少なくとも表示できません。(jstack のドキュメントは少しまばらです。)
5) 大量の IO、メモリ使用量、または対応するその他の対応するアクティビティの手がかりはありません。
プラットホーム:
- Java 6
- トムキャット6
- RHEL 4 (64 ビット)
Linux ps 出力から問題の子 Java スレッドに接続する方法を知っている人はいますか? こんなに近くて、まだ遠い…