【发布时间】:2012-01-05 23:57:01
【问题描述】:
我必须处理的一个应用程序使用ProcessBuilder 定期启动 shell 帮助程序。由于不为人知的原因,它仍然在 32 位 JVM(Sun,1.6.0.25)上运行,即使底层操作系统是 64 位(RHEL 5.x 值得)。
这个应用程序是内存快乐的,所以堆大小设置为最大 3 GB,permgen 为 128M。
但是... 在随机时刻,shell 助手无法启动。不是因为 OutOfMemory,而是 ENOMEM……我能看到的唯一原因是地址空间不足。
好吧,当然,但与此同时,内存并没有真正承受压力,top 报告说 JVM 的实际内存使用量及其虚拟集大小甚至不到 3 GB...
看看Process 的代码可以看到什么,我看到核心方法被称为forkAndExec(),这几乎是不言自明的......根据我对这两个系统调用的了解,它应该'失败。但确实如此。并非总是如此。
为什么?
edit:需要注意的是使用了neo4j。好像经常使用FileChannel,会不会是地址空间不足的原因?
【问题讨论】:
-
如果我没记错的话,当产生一个新进程时,Linux 最初会为新进程分配与父进程相同数量的内存。该分配立即调整为正确的大小。是否可能没有足够的可用内存来进行初始大小调整?我记得我们必须通过允许在操作系统中过度使用内存来解决这个问题。
标签: java fork processbuilder