2010-06-28 162 views
4

我有一个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。

回答

3

我相信,默认最大内存池 为64MB,而我当时正在接近64 这些过程。所以这将是 4GB全部告诉...在32位 限制。

不需要。32位限制是每个进程(至少在64位操作系统上)。但default maximum heap is not fixed at 64MB

初始堆尺寸:的 机器的物理存储器1/64的 机或一些合理的最小上更大。

最大堆大小:小1/4的 物理内存或1GB。

注意:为J2SE 5.0提供的堆大小的边界和分数是正确的。随着计算机功能越来越强大,它们在后续版本中可能会有所不同。

+0

啊,是的,谢谢你,我正在回忆起1.4的旧限制。是的,我知道这个限制是按流程进行的,但我在抓秸秆。 – 2010-06-28 20:57:50

1

我怀疑内存是零散的。还请检查Tools to view/solve Windows XP memory fragmentation以确认内存碎片可能导致此类错误。

+0

对不起,但我没有看到任何问题,可以确认内存碎片会导致此问题。实际上,http://stackoverflow.com/questions/171205/java-maximum-memory-on-windows-xp似乎表明内存只需要在JVM本身的地址空间内连续进行......如果我错了,你说得对,我有什么想法来证实这一点? – 2010-06-28 21:33:21

相关问题