我有一个Solaris sparc(64位)服务器,它有16 GB的内存。有很多小型Java进程正在运行,但是今天我尝试启动一个新的时候出现了“无法为对象堆预留足够的空间”错误。我很惊讶,因为服务器上仍然有4GB以上的空闲空间。新流程能够在一些其他流程关闭后成功启动;该系统肯定已经达到某种上限。64位操作系统上的32位Java:JVM的数量是否有限制?
在网络搜索解释之后,我开始怀疑它是否与我使用32位JVM(这个服务器上的所有java进程都不需要太多内存)有关。
我相信默认的最大内存池是64MB,并且我正在运行接近64个这些进程。因此,这将是4GB的所有告诉......在32位的限制。但我不明白为什么或者如何这些过程会受到其他过程的影响。如果我是对的,那么为了运行更多这些进程,我必须调整最大堆低于默认值,否则切换到使用64位JVM(这可能意味着提高最大堆要高于这些过程的默认值)。我并不反对这些,但我不想浪费时间,现在它仍然是黑暗中的一个镜头。
任何人都可以解释为什么它可能以这种方式工作吗?或者我完全错误?
如果我对这个解释是正确的,那么可能有这方面的文档:我非常想找到它。 (我运行Sun的JDK 6更新17如果该事项。)
编辑:我完全错了。下面的答案证实了我的直觉,我没有理由不能运行尽可能多的JVM。稍后,我在尝试运行非java进程的同一台服务器上出现错误:“fork:没有足够的空间”。所以,我遇到了一些其他限制,这不是特定于Java的。我必须弄清楚它是什么(不,它不是交换空间)。很可能,我去了serverfault。
啊,是的,谢谢你,我正在回忆起1.4的旧限制。是的,我知道这个限制是按流程进行的,但我在抓秸秆。 – 2010-06-28 20:57:50