【发布时间】:2010-09-18 08:05:59
【问题描述】:
在我最繁忙的生产安装中,有时我会遇到一个似乎卡在无限循环中的线程。经过大量研究和调试,我还没有弄清楚谁是罪魁祸首,但似乎应该是可能的。以下是血淋淋的细节:
当前调试说明:
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:等待(在对象监视器上)
在 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 线程建立连接?这么近,这么远……
【问题讨论】: