如果指定的最大堆大小大于可用 RAM,会发生什么情况
在面试中被问到。如果指定的最大堆大小 (Xmx) 大于可用 RAM,会发生什么情况?我还想知道,如果您指定的最小堆大小(Xms)大于可用RAM会发生什么?
在面试中被问到。如果指定的最大堆大小 (Xmx) 大于可用 RAM,会发生什么情况?我还想知道,如果您指定的最小堆大小(Xms)大于可用RAM会发生什么?
找出答案的最简单方法是尝试一下,看看。
编辑:这个问题实际上至少有两个答案。如前所述,可能在 64 位系统上,你的应用可能会在内存使用量方面不断增长并开始崩溃。在32位系统上,故事有点不同,因为操作系统无法为您提供那么多的堆空间。例如,如果我在Windows XP上运行一个带有32位java的应用程序,命令行选项为-Xmx2000m,它将死机并显示类似于以下内容的消息:
最大堆大小无效:-Xmx2000m
指定的大小超过了最大可表示大小。
无法创建 Java 虚拟机。
在具有32位java的Linux中,我使用-Xmx3000m获得以下内容:
无法创建 Java 虚拟机。
VM 初始化期间发生错误
无法为对象堆保留足够的空间
在具有32位java的Linux中,我用-Xmx6000m得到以下内容
最大堆大小无效:-Xmx6000m
指定的大小超过了最大可表示大小。
无法创建 Java 虚拟机。
尝试使用64位Java,JVM确实允许您分配比物理RAM更多的内存,但是如果您要求非常大的内存量,jvm将再次失败并出现错误。
仅当 -Xms(最小值)大于可用内存时,JVM 初始化时才会立即失败
$>java -Xms100g #JVM fails to start
Error occurred during initialization of VM Could not
reserve enough space for object heap
如果 -Xmx(最大值)大于可用内存,则 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
在接近 -Xmx 限制之前,它不会“抖动”,但是如果该限制高于您的可用内存,您将收到上述内存分配错误,并且您的程序将在考虑抖动之前终止。(这是非常戏剧性的!