在我最繁忙的生产环境中,有时会出现一个单线程似乎陷入了无限循环。经过大量研究和调试后,我还没有弄清是谁干的,但似乎应该是有可能找到问题根源的。以下是详细信息:
目前的调试说明:
1)ps -eL 18975 告诉我这个问题线程的Linux进程ID是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输出的线程ID与jstack的输出不匹配,或者说至少我看不到它。(jstack文档有点稀疏。)
5) 没有重型IO、内存使用或其他相应的活动线索可用。
平台:
- Java 6
- Tomcat 6
- RHEL 4 (64位)
有人知道我如何从Linux ps输出中找出我的问题Java线程吗?离成功只差一步...
hexNid2dec(pid)
的数学错误。或者可能是我做了其他什么极其愚蠢的事情。 - Stu Thompsonjstack <PID> | perl -ne 'if (/nid=(0x[[:xdigit:]]+)/) { $lwp = hex($1); s/nid=/lwp=$lwp nid=/; } print;'
- tekumara