3

我必须定期处理的一个应用程序使用ProcessBuilder. 由于不为人知的原因,它仍然在 32 位 JVM(Sun,1.6.0.25)上运行,即使底层操作系统是 64 位(RHEL 5.x 值得)。

这个应用程序是内存快乐的,所以堆大小设置为最大 3 GB,permgen 为 128M。

然而......在随机时刻,shell 助手无法启动。不是因为 OutOfMemory,而是 ENOMEM……我能看到的唯一原因是地址空间不足。

好吧,当然,但与此同时,内存并没有真正承受压力,并top报告说 JVM 的实际内存使用量及其虚拟集大小甚至不到 3 GB...

查看可以查看的代码Process,我看到核心方法被调用forkAndExec(),这几乎是不言自明的......根据我对这两个系统调用的了解,它不应该失败。但确实如此。而且并非总是如此。

为什么?

编辑:应该注意使用了neo4j。好像经常使用FileChannel,会不会是地址空间不足的原因?

4

2 回答 2

1

我认为您正在被Linux 内存过度使用杀死您的进程所困扰。该博客文章建议您可以调整一个 sysctl 变量。

于 2012-01-06T00:08:25.210 回答
1

我会减小堆大小。实际使用的堆数量可能会为分叉进程运行留下越来越少的空间(它从其父进程继承资源)

很可能只升级到 64 位 JVM 就可以解决问题,您可以尝试 Java 6 update 30 64 位代替(只是看看它是否会解决问题)如果有或没有,它应该告诉更多关于原因是什么(然后你可以决定是否值得切换)

于 2012-01-06T08:15:58.823 回答