我必须定期处理的一个应用程序使用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,会不会是地址空间不足的原因?