代码之家  ›  专栏  ›  技术社区  ›  Zac Thompson

64位操作系统上的32位Java:JVM的数量有限制吗?

  •  4
  • Zac Thompson  · 技术社区  · 16 年前

    我有一个SolarisSPARC(64位)服务器,它有16GB的内存。在Java上运行了很多Java小进程,但今天我在尝试启动一个新的Java进程时得到了“不能为对象堆保留足够的空间”。我很惊讶,因为服务器上仍然有超过4GB的空闲空间。在其他一些进程关闭后,新进程能够成功启动;系统肯定达到了某种程度的上限。

    在搜索Web的解释之后,我开始怀疑它是否与我使用32位JVM(没有这个服务器上的Java进程需要太多内存)有关。

    我相信默认的最大内存池是64MB,我运行的这些进程接近64个。那就是说4GB…就在32位限制。但我不明白这些过程中的任何一个为什么或如何会受到其他过程的影响。如果我是对的,那么为了运行更多的这些进程,我要么调整max堆使其低于默认值,要么切换到使用64位JVM(这可能意味着将max堆提升到高于这些进程的默认值)。我不反对这两种,但我不想浪费时间,现在这仍然是黑暗中的一次尝试。

    有人能解释一下为什么会这样吗?还是我完全错了?

    如果我对这个解释是正确的,那么可能有关于这个的文档:我非常想找到它。(我正在运行Sun的JDK 6更新17,如果这很重要的话。)

    编辑 : 我完全错了 . 下面的答案证实了我的直觉,我没有理由不能运行尽可能多的JVM。过了一会儿,我在同一个服务器上尝试运行非Java进程:“Foe:没有足够的空间”时出错。所以我遇到的不是Java特定的限制。我得弄清楚它是什么(不,它不是交换空间)。很可能是服务器故障。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Michael Borgwardt    16 年前

    我相信默认的最大内存池 是64MB,我的运行速度接近64 这些过程。所以那是 极限。

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

    初始堆大小:大于1/64 机器的物理内存 机器或一些合理的最低限度。

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

    注意:对于J2SE5.0,给出的堆大小边界和分数是正确的。随着计算机功能的增强,它们在随后的版本中可能会有所不同。

        2
  •  1
  •   Community Mohan Dere    9 年前

    我怀疑记忆是支离破碎的。也检查 Tools to view/solve Windows XP memory fragmentation 以确认内存碎片可能导致此类错误。

    推荐文章