我有一个“随机”悬挂的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,无论是从挂起的服务器,并正常工作。
你有没有试过jstack或jvisualvm ?
JVM崩溃时是否创build了任何核心文件?
您也可以将GC统计信息写入日志文件。 这可能会提供更多关于JVM挂起的信息。
有没有其他的JVM使用该机器上运行的Java版本? 我的第一个假设是JRE有问题,可能需要重新安装。
希望有所帮助!
汤姆·珀尔
你用-Xrs开关启动你的jvm(或带有java选项的容器)吗? 我认为这个命令行选项可以防止kill -3的工作。 如果是这样,如果您使用的是1.5或更高版本的jvm,则可以使用jstack获得线程转储。