Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果指定的最大堆大小大于可用RAM,会发生什么情况_Java_Memory - Fatal编程技术网

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

Java 如果指定的最大堆大小大于可用RAM,会发生什么情况,java,memory,Java,Memory,在采访中问道。如果指定的最大堆大小(Xmx)大于可用RAM,会发生什么情况? 我还想知道,如果指定的最小堆大小(Xms)大于可用RAM,会发生什么情况?最简单的方法就是试试看 编辑: 这个问题实际上至少有两个答案。正如前面提到的,可能在64位系统上,您的应用程序的内存使用量会不断增长,并开始崩溃。在32位系统上,情况有点不同,因为操作系统不能给你那么多堆空间。例如,如果我在Windows XP上使用32位java和命令行选项-Xmx2000m运行一个应用程序,它将消失,并显示类似以下消息: 无效

在采访中问道。如果指定的最大堆大小(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将再次失败并出现错误。


尽管在某些低端嵌入式系统中也会出现这种情况,但如今即使在嵌入式系统中也很少看到非虚拟Java环境,在桌面或服务器上也不可能看到

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

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

只有当-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限制之前,它不会“抖动”,但如果该限制高于可用内存,则会出现上述内存分配错误,并且程序将在考虑抖动之前终止。(这非常戏剧性!)

然后告诉我们答案!;)好了。尝试一下,看看你是否得到了与我相同的结果。那么,当你将它设置为高于RAM+虚拟内存时会发生什么?