如果Java虚拟机重复崩溃,我该怎么办?

问题描述:

什么是解决Java虚拟机崩溃的最佳做法,如果后续的条件:如果Java虚拟机重复崩溃,我该怎么办?

  • 没有自己或第三方本地代码。 100%纯java
  • 在许多其他系统上运行相同的程序没有任何问题。

PS:虚拟机崩溃时,意味着虚拟机写入一个类似hs_err_pid1234.log的转储文件并终止。

+0

which os/platform? (我们知道java是平*立的:-) – Blauohr 2008-10-22 10:56:52

更新或替换您的JVM。如果您目前拥有最新版本,请尝试更旧版本,或者如果您没有最新版本,请尝试更新。也许它是你的特定版本中的一个已知问题?

读取hs_err_pid1234.log文件(或任何错误日志文件名称)。那里通常有线索。下一步取决于您在日志中发现的内容。

是的,它可能是您正在使用的JVM实现的特定版本中的一个错误,但我也看到了操作系统中内存碎片导致的问题。例如,Windows很容易在不适当的位置安装dll,并且当JVM因此要求时,无法分配连续的内存块。其他的opf内存问题也可以通过这种类型的崩溃转储来体现。

假设JVM版本跨机器是一样的:

弄清楚什么是关于在JVM崩溃的机器不同。相同OSOS版本?例如,我们在特定版本的Red Hat上遇到JVM崩溃问题。而且我们还发现一些较旧的红帽版本无法正确处理额外的内存,导致交换空间不足。 (我们的解决方案是升级RedHat)。

此外,该程序是否在正好跨机器相同的东西?它访问共享文件系统吗?文件系统是否类似地安装在您的机器上(SMB/NFS等)?东西一定是不一样的。

日志文件应该让你知道发生崩溃的位置(例如malloc)。

查看转储文件中的堆栈跟踪,因为它应该告诉您发生崩溃时发生了什么。

除了挖掘到hs_err转储文件,我还会将它提交给Sun或任何制作您的JVM的人(我相信在文件顶部有如何操作的说明?)。它不会伤害。

32bit? 64位?客户机中的ram数量?处理器?操作系统?查看系统之间是否有任何连接。连接可能会导致线索。如果一切都失败了,请考虑使用不同的主要/次要版本的JVM。另外,如果JUST开始的问题可以通过一段时间(通过版本控制)来避免程序崩溃?查看hs_err日志,您可能会了解导致崩溃的原因。它可能是JVM使用的其他客户端库的一个版本。最后,在调试/配置文件中运行该程序,也许你会在崩溃前看到一些症状(假设你可以复制它)