![挂起的 Java JVM 无法响应 kill -3](https://linux22.com/image/545325/%E6%8C%82%E8%B5%B7%E7%9A%84%20Java%20JVM%20%E6%97%A0%E6%B3%95%E5%93%8D%E5%BA%94%20kill%20-3.png)
我有一个 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
您尝试过jstack
吗jvisualvm
?
答案3
JVM 崩溃时是否会创建任何核心文件?
您还可以将 GC 统计信息写入日志文件。这可能会提供有关 JVM 挂起原因的更多信息。
该机器上是否有其他使用该版本 Java 的 JVM 运行?我的第一个假设是 JRE 有问题,可能需要重新安装。
希望有帮助!
汤姆·普尔
答案4
您是否使用 -Xrs 开关启动 jvm(或带有 java 选项的容器)?我认为此命令行选项会阻止 kill -3 工作。如果是这样,如果您使用的是 1.5 或更高版本的 jvm,则可以使用 jstack 获取线程转储。