Hung Java JVM无法响应kill -3

我有一个“随机”悬挂的Java虚拟机。 我引用了这个随机的一点,因为显然有一个虚拟机悬挂的原因,但是挂起并不是周期性的。 我们有相同的软件运行在不同的客户环境中,在这些环境中,JVM并没有挂起。

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

我花了很多时间来testing代码,以定期logging希望抓住JVM的线程堆栈跟踪,以显示问题出在哪里,但到目前为止,这种尝试还没有产生太多的成果。

不幸的是,我还没有能够在我的实验室环境中重现这个问题,所以我受限于在客户网站上可以做的事情。

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

有没有人有这个问题? 关于为什么kill -3无法产生Java线程转储的任何想法?

谢谢!

听起来你可能会用完堆空间。

即使您的JVM不生成线程转储,您也应该能够生成堆转储。 这和GC统计数据一起,也会让你知道发生了什么。 请参阅您的JVM的文档以了解如何以二进制格式生成堆转储。 然后下载内存分析器并打开堆转储文件,看看什么是占用内存。 通常,可以使用带有适当选项的jmap命令。 生成堆转储将导致您的JVM减慢相当多; 我已经看到需要30分钟才能生成1.5GB大容量的堆转储YMMV。

此外,张贴您的Javaselect,无论是从挂起的服务器,并正常工作。

你有没有试过jstackjvisualvm

JVM崩溃时是否创build了任何核心文件?

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

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

希望有所帮助!

汤姆·珀尔

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