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