32位Java在64位操作系统上:JVM数量是否有限制?

4
我有一台Solaris sparc(64位)服务器,内存为16 GB。上面运行着许多小型Java进程,但今天在尝试启动新进程时出现了“无法为对象堆保留足够的空间”的错误。我感到惊讶,因为服务器上仍然有超过4GB的可用空间。在关闭一些其他进程后,新进程成功启动;系统肯定达到了某种限制。
在搜索网络以获取解释后,我开始怀疑这是否与我使用32位JVM有关(此服务器上的任何Java进程都不需要太多内存)。
我相信默认的最大内存池是64MB,我正在运行接近64个这样的进程。所以总共就是4GB……正好达到32位限制。但我不明白为什么或者如何会影响其他任何进程。如果我是正确的,那么为了运行更多这些进程,我将不得不调整最大堆大小低于默认值,或者切换到使用64位JVM(这可能意味着将最大堆大小提高到这些进程的默认值以上)。我对这两个方案都没有反对意见,但现在还是一个无从下手的问题。
有人能解释为什么会这样吗?或者我完全错了?
如果我的解释是正确的,那么可能会有相关文档:我非常想找到它(如果有的话)。 (我正在运行Sun的JDK 6更新17,如果有影响的话。)
编辑:我完全错了。下面的答案证实了我的直觉,即没有理由不能运行尽可能多的JVM。过了一会儿,我在同一台服务器上尝试运行非Java进程时出现了错误:“fork: not enough space”。因此,我遇到的是不特定于Java的其他限制。我必须找出是什么(不,这不是交换空间)。我很可能去ServerFault寻求帮助。
2个回答

3
我相信默认的最大内存池是64MB,我运行了接近64个这样的进程。总共会达到4GB...就在32位极限处。
不是的。32位极限是每个进程(至少在64位操作系统上)。但默认的最大堆大小并不固定为64MB
初始堆大小:机器物理内存的1/64或某个合理最小值中较大的一个。
最大堆大小:物理内存的1/4或1GB中较小的一个。
注意:堆大小的界限和分数适用于J2SE 5.0。随着计算机变得更加强大,它们可能在后续版本中有所不同。

啊,是的,谢谢,我在回忆1.4版本的旧限制。是的,我知道这个限制是每个进程的,但我只是试图寻找一些可能性。 - Zac Thompson

1

抱歉,但我在那个问题中没有看到任何证实内存碎片会导致这个问题的东西。事实上,https://dev59.com/M3VC5IYBdhLWcg3w1E1q 似乎表明内存只需要在JVM本身的地址空间内是连续的...如果我错了而你是对的,有什么办法可以确认这一点吗? - Zac Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接