挂起的 Java JVM 无法响应 kill -3

挂起的 Java JVM 无法响应 kill -3

我有一个 Java VM 会“随机”挂起。我引用“随机”部分,因为 VM 挂起显然是有原因的,但挂起并非定期发生。我们在不同的客户环境中运行相同的软件,在这些环境中,JVM 不会挂起。

在尝试排除挂起故障的过程中,该进程的 CPU 利用率为零。然后我尝试执行 kill -3,但 kill 命令挂起。没有生成 JVM 线程转储。

我花了很多时间来检测代码,定期记录线程堆栈跟踪,希望能够捕捉到 JVM 的状态,从而指出问题所在,但到目前为止,这种尝试还没有取得多大成果。

不幸的是,我无法在我的实验室环境中重现此问题,因此我受到在客户站点上能做的事情的限制。

有问题的操作系统是运行 Java 版本 1.6.0_05-b13 的 Red Hat Enterprise 5.4 和 SUSE 10

有人遇到过这个问题吗?你知道为什么 kill -3 无法生成 Java 线程转储吗?

谢谢!

答案1

听起来你可能已经用完了堆空间。

即使您的 JVM 不生成线程转储,您也应该能够生成堆转储。这和 GC 统计信息一起,还能让您深入了解正在发生的事情。请参阅 JVM 的文档,了解如何以二进制格式生成堆转储。然后下载内存分析器并打开堆转储文件以查看占用内存的内容。通常,可以使用jmap带有适当选项的命令。生成堆转储会导致 JVM 速度减慢很多;我见过需要 30 分钟才能生成 1.5GB 大小的堆转储,YMMV。

另外,发布您的 java opts,包括挂起的服务器和正常工作的服务器。

答案2

您尝试过jstackjvisualvm

答案3

JVM 崩溃时是否会创建任何核心文件?

您还可以将 GC 统计信息写入日志文件。这可能会提供有关 JVM 挂起原因的更多信息。

该机器上是否有其他使用该版本 Java 的 JVM 运行?我的第一个假设是 JRE 有问题,可能需要重新安装。

希望有帮助!

汤姆·普尔

答案4

您是否使用 -Xrs 开关启动 jvm(或带有 java 选项的容器)?我认为此命令行选项会阻止 kill -3 工作。如果是这样,如果您使用的是 1.5 或更高版本的 jvm,则可以使用 jstack 获取线程转储。

相关内容