【问题标题】:Understanding max JVM heap size - 32bit vs 64bit了解最大 JVM 堆大小 - 32 位与 64 位
【发布时间】:2011-01-28 06:55:29
【问题描述】:

read 32 位 Windows 上的最大堆大小约为 1.5GB,这是因为 JVM 需要连续内存。有人可以解释“连续内存”的概念以及为什么在 Windows 上最多只有 1.5GB 吗?

其次,64 位 Windows 上的最大堆大小是多少,为什么这与 32 位上可用的不同?

【问题讨论】:

  • 32 位操作系统上任何 32 位 jvm 的限制范围从大约 1.2 GB(某些版本的 Windows)到 2.0 GB (Solaris)。 64 位 Solaris 上的 32 位 jvm 可以获得 4 GB。我认为 64 位 Windows 上的最大 64 位 jvm 是 32GB。
  • 我原本预计 64 位 Win7 上的 32 位 JVM 也能够获得 4GB - 但事实并非如此 - 又是那些 1.5GB...(JDK5)

标签: java jvm heap-memory


【解决方案1】:

连续内存不是限制 Windows 仅使用 1.2 GB 堆的问题。即使定义了最小/最大堆,JVM 在启动时也会从系统内存中占用最大堆。然后它将仅引用占用的系统内存中的最小堆,直到它必须扩展。为了提高性能,大多数情况下都需要最大堆的连续内存来启动 JVM。

正如 Marcus 上面解释的那样,单个进程(线程)的 32 位硬件限制为 4GB。每个操作系统都以不同的方式处理这 4GB。 4GB 主要分为内核空间和用户空间。在 32 位窗口中,最大用户空间接近 1.5 GB。可以选择使用 /3GB 开关启动 Windows 以获得更多用户空间。

【讨论】:

    【解决方案2】:

    32位/64位部分与Java无关

    事实证明,32 位系统中的内存位置由 32 位无符号整数引用。这允许多达 2^32 个可能的内存位置。由于每个位置存储 1 个字节,因此如果您愿意,您可以获得 2^32 个字节或 4 GB。

    在 64 位系统上,有 2^64 个位置,即 16 艾字节。

    现在,在 Windows 中,连续部分成为一个大问题,但这正是 Windows 的工作方式。这个想法是你的堆需要有一个完整的“不间断”范围。可悲的是,Windows 在中间的某个地方分配了一些内存。这基本上让你有大约一半的左侧或一半的右侧,大约 1.5-2GB 块,来分配你的堆。

    查看this question 了解有关 32 位与 64 位的更多详细信息。

    编辑:感谢 mrjoltcola 提供 exa 前缀!

    【讨论】:

    • exa 出现在 peta 之后;) 我已经暗示了一些,但我认为值得指出的是,由于地址空间如此之大,因此更容易找到更大的连续可用地址空间块——这就是为什么您可以在 64 位操作系统上指定更大的堆大小的原因。
    • 另外值得注意的是,对于内存来说,一个 Exabyte 是 1024^6 字节,一个 Exabyte 的存储空间是 1000^6 字节。所以 2^64 是 16 艾字节的内存和 18.4 艾字节的存储空间。 ;)
    【解决方案3】:

    连续只是意味着“没有间隙”,一个长的单段。数量受限于操作系统可以为您的进程映射多大的段。 Java 是否需要连续堆是 JVM 特有的实现问题,其他 VM 可能不存在。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 2014-03-14
      • 2012-04-30
      • 2014-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-05
      • 2011-12-25
      相关资源
      最近更新 更多