【发布时间】:2011-11-08 04:40:28
【问题描述】:
我在构建服务器上遇到一个间歇性问题,其中构建中的 Java 进程以某种方式无法终止,并且似乎永远继续运行(使用 100% 的 CPU)(我已经看到它运行了 2 天以上)周末通常需要大约 10 分钟)。 kill -9 pid 似乎是停止进程的唯一方法。
我尝试在进程上调用kill -QUIT pid,但它似乎没有产生任何到 STDOUT 的堆栈跟踪(也许它没有响应信号?)。没有 -F force 选项的 jstack 似乎无法连接到正在运行的 JVM,但使用 force 选项它确实会产生下面的输出。
不幸的是,即使有该堆栈跟踪,我也看不到任何明显的进一步调查路径。
据我所知,它显示了两个运行 Object.wait 的“BLOCKED”线程(它们的堆栈似乎只包含核心 Java 代码,没有我们的代码)和第三个是“IN_VM”,没有堆栈输出。
我应该采取哪些步骤来收集有关问题原因的更多信息(或者更好的是,我该如何解决它)?
$ /opt/jdk1.6.0_29/bin/jstack -l -F 5546 正在附加到进程 ID 5546,请稍候... 调试器连接成功。 检测到服务器编译器。 JVM版本为20.4-b02 死锁检测: 没有发现死锁。 使用 Printezis 位查找对象大小并跳过... 线程 5555:(状态 = 阻塞) 锁定的可拥有同步器: - 没有任何 线程 5554:(状态 = 阻塞) - java.lang.Object.wait(long) @bci=0 (解释帧) - java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (解释帧) - java.lang.ref.ReferenceQueue.remove() @bci=2, line=134(解释帧) - java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=159(解释帧) 锁定的可拥有同步器: - 没有任何 线程 5553:(状态 = 阻塞) - java.lang.Object.wait(long) @bci=0 (解释帧) - java.lang.Object.wait() @bci=2, line=485(解释帧) - java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116(解释帧) 锁定的可拥有同步器: - 没有任何 线程 5548:(状态 = IN_VM) 锁定的可拥有同步器: - 没有任何(Java 版本 1.6.0 更新 29,在 Scientific Linux 版本 6.0 上运行)
更新:
运行strace -f -p 894 会产生看似无穷无尽的...
[pid 900] sched_yield() = 0
[pid 900] sched_yield() = 0
...
然后当Ctrl-Cd时
Process 894 detached
...
Process 900 detached
...
Process 909 detached
jmap -histo 894 未连接但jmap -F -histo 894 返回...
【问题讨论】:
-
您可以尝试在运行服务器的控制台上按 [CTRL]+[SYSREQ]。这将为您提供一个尽可能详细的线程转储。