【发布时间】:2011-04-08 14:05:23
【问题描述】:
在采访中被问到。如果您指定的最大堆大小 (Xmx) 大于可用 RAM,会发生什么情况? 我还想知道如果您指定的最小堆大小 (Xms) 大于可用 RAM 会发生什么?
【问题讨论】:
在采访中被问到。如果您指定的最大堆大小 (Xmx) 大于可用 RAM,会发生什么情况? 我还想知道如果您指定的最小堆大小 (Xms) 大于可用 RAM 会发生什么?
【问题讨论】:
找出答案的最简单方法是尝试一下。
编辑: 这个问题实际上至少有两个答案。如前所述,可能在 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 将再次失败并出现错误。
【讨论】:
只有当您的 -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 之前终止. (这是非常戏剧性的!)
【讨论】: