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

时间:2010-09-06 00:46:25

标签: java memory

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

3 个答案:

答案 0 :(得分:12)

最简单的方法是尝试并查看。

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

  

无效的最大堆大小:-Xmx2000m

     

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

     

无法创建Java虚拟机。

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

  

无法创建Java虚拟机。

     

VM初始化期间发生错误

     

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

在使用32位java的Linux中,我使用-Xmx6000m

获得以下内容
  

无效的最大堆大小:-Xmx6000m

     

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

     

无法创建Java虚拟机。

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

答案 1 :(得分:4)

没什么戏剧性的


尽管某些低端嵌入式系统可能会发生这种情况,但现在很少见到非虚拟Java环境,即使是嵌入式也无法在桌面或服务器上进行。

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

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

答案 2 :(得分:3)

仅当 -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限制之前,它不会'thrash',但是如果该限制超出了您的可用内存,则会出现上述内存分配错误,并且您的程序将终止,甚至不会考虑thrashing 。 (那非常戏剧性!)