【问题标题】:What happens if you specify max heap size greater than available RAM如果您指定的最大堆大小大于可用 RAM,会发生什么情况
【发布时间】:2011-04-08 14:05:23
【问题描述】:

在采访中被问到。如果您指定的最大堆大小 (Xmx) 大于可用 RAM,会发生什么情况? 我还想知道如果您指定的最小堆大小 (Xms) 大于可用 RAM 会发生什么?

【问题讨论】:

    标签: java memory


    【解决方案1】:

    找出答案的最简单方法是尝试一下。

    编辑: 这个问题实际上至少有两个答案。如前所述,可能在 64 位系统上,您的应用程序可能会在内存使用量上不断增长并开始抖动。在 32 位系统上,情况略有不同,因为操作系统无法为您提供那么多堆空间。例如,如果我在带有命令行选项 -Xmx2000m 的 32 位 java 的 Windows XP 上运行应用程序,它会死机并显示类似以下的消息:

    最大堆大小无效:-Xmx2000m

    指定的大小超过了最大可表示的大小。

    无法创建 Java 虚拟机。

    在具有 32 位 java 的 Linux 中,我使用 -Xmx3000m 得到以下信息:

    无法创建 Java 虚拟机。

    虚拟机初始化时出错

    无法为对象堆保留足够的空间

    在具有 32 位 java 的 Linux 中,我使用 -Xmx6000m 得到以下结果

    最大堆大小无效:-Xmx6000m

    指定的大小超过了最大可表示的大小。

    无法创建 Java 虚拟机。

    尝试使用 64 位 Java 时,JVM 确实允许您分配比物理 RAM 更多的内存,但如果您要求非常大的内存量,jvm 将再次失败并出现错误。

    【讨论】:

    • 然后告诉我们答案! ;)
    • 你去。尝试一下,看看你是否得到了与我相同的结果。
    【解决方案2】:

    只有当您的 -Xms (minimum) 大于可用内存时,JVM 初始化才会立即失败

    $>java -Xms100g            #JVM fails to start
    Error occurred during initialization of VM Could not
    reserve enough space for object heap
    

    如果您的 -Xmx (maximum) 大于可用内存,则您的 JVM 会初始化,因为您尚未使用内存

    $>java -Xmx100g            #JVM starts up fine
    Usage: java [-options] class [args...]
    ...
    

    如果您的 -Xmx(最大值)大于可用内存(包括任何虚拟内存的总内存),您遇到运行时故障当且仅当您的JVM 进程实际上会尝试使用比机器更多的内存。

    OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00007f5feb100000, 927465472, 0) failed; error='Cannot allocate memory' (errno=12)
    #
    # There is insufficient memory for the Java Runtime Environment to continue.
    # Native memory allocation (mmap) failed to map 927465472 bytes for committing reserved memory.
    # An error report file with more information is saved as:
    # /some/file/path/hs_err_pid25.log
    

    它不会'thrash',直到它接近您的 -Xmx 限制,但如果该限制高于您的可用内存,您将收到上述内存分配错误,并且您的程序将在甚至考虑 thrashing 之前终止. (这是非常戏剧性的!)

    【讨论】:

      【解决方案3】:

      没什么戏剧性的


      尽管在某些低端嵌入式系统上可能会发生这种情况,但如今,即使在嵌入式系统中也很少看到非虚拟 Java 环境,而且在台式机或服务器上是不可能的。

      因此,不会发生什么戏剧性的事情,但是一旦你用完可用的 RAM,分配额外的(虚拟)内存只会不必要地延迟回收(垃圾收集)并导致程序启动 paging

      如果严重的话,这种情况被称为“thrashing”,这不是一件好事。东西会运行得很慢。

      【讨论】:

      • 那么当你将它设置为高于 RAM + 虚拟内存时会发生什么?
      猜你喜欢
      • 2018-02-18
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2022-01-21
      相关资源
      最近更新 更多