我在 Ubuntu Server 10.04.1 和 10.04.2 上都遇到过很多 Sun JVM 崩溃的情况。崩溃似乎是随机发生的。有时它们发生在服务器压力过大时,有时发生在服务器上根本没有负载时。
我正在运行一个主机,其中有四台虚拟机,使用 KVM 作为虚拟化技术。每台虚拟机都配置有 1 GB 的内存。
主人:
law@gandalf:~$ uname -a Linux gandalf 2.6.32-27-server #49-Ubuntu SMP 星期四 十二月 2 02:05:21 UTC 2010 x86_64 GNU/Linux
各位来宾:
confluence@lw-confluence:~$ uname -a Linux lw-confluence 2.6.32-24-server #43-Ubuntu SMP 星期四 9 月 16 日 16:05:42 UTC 2010 x86_64 GNU/Linux
我在 3 个客户机上运行一个 Tomcat 实例,其中包含一个应用程序。我正在运行:
- 1 个 Atlassian Jira 实例
- 1 个 Atlassian Confluence 实例
- 1 个 Magnolia CMS 实例
我在这三台机器上都经历过 JVM 随机崩溃。我在 JVM 版本 1.6.0_22(64 位)、1.6.0_24(64 位)和 1.6.0_24(32 位)中都经历过这些崩溃。
崩溃似乎始终发生在对 libjvm.so 的本机调用中。我相信这是在 JVM 请求垃圾回收时发生的,但我对此并不完全确定。我有一些崩溃转储的示例:
在运行 Confluence 的客户机上:
在运行 Jira 的客户机上:
到目前为止我已经尝试了以下方法:
- 重新安装 JVM
- 将 JVM 从 1.6.0_22 更新至 1.6.0_24
- 使用 32 位 JVM 而不是 64 位版本
我有点不知道下一步该尝试什么,所以如果能提供任何帮助我将非常感激。
答案1
网络上有报道称类似的操作也发生了崩溃,这似乎与 PermGen 的最大尺寸设置不健康有关。
通过 VM 参数可以看出,PermGen 似乎有 256 MB 可用,但堆只允许有 384/512 MB,这至少在我看来是一种不常见的设置。对于堆这么小的进程,我不认为 PermGen 需要任何特殊设置(但这实际上取决于您的进程执行的操作)。
但是,如果您没有主意,我会尝试删除此 VM 参数:
-XX:MaxPermSize=256m
OutOfMemoryError: PermGen size
如果此设置确实存在原因,则可能会导致您的应用陷入某些运行状态,但至少不会导致虚拟机完全崩溃。这样,您至少可以排除故障,看看崩溃是否与此设置有关。