如果指定的最大堆大小大于可用RAM,会发生什么

ill*_*car 20 java memory

在接受采访时被问到.如果指定的最大堆大小(Xmx)大于可用RAM,会发生什么?我还想知道如果指定最小堆大小(Xms)大于可用RAM会发生什么?

Jay*_*ren 12

找出答案的最简单方法是尝试并查看.

编辑: 问题实际上至少有两个答案.可能在64位系统上,如前所述,您的应用程序可能会在内存使用量增长和增长并开始颠簸.在32位系统上,故事有点不同,因为操作系统无法为您提供那么多堆空间.例如,如果我使用命令行选项-Xmx2000m在Windows XP上运行带有32位java的应用程序,它将会消失,其消息类似于以下内容:

无效的最大堆大小:-Xmx2000m

指定的大小超出了最大可表示大小.

无法创建Java虚拟机.

在使用32位java的Linux中,我使用-Xmx3000m得到以下内容:

无法创建Java虚拟机.

VM初始化期间发生错误

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

在使用32位java的Linux中,我使用-Xmx6000m获得以下内容

无效的最大堆大小:-Xmx6000m

指定的大小超出了最大可表示大小.

无法创建Java虚拟机.

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


Ste*_*rCS 12

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

$>java -Xms100g            #JVM fails to start
Error occurred during initialization of VM Could not
reserve enough space for object heap
Run Code Online (Sandbox Code Playgroud)

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

$>java -Xmx100g            #JVM starts up fine
Usage: java [-options] class [args...]
...
Run Code Online (Sandbox Code Playgroud)

如果您的 -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
Run Code Online (Sandbox Code Playgroud)

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