如果指定最大堆大小大于可用RAM,会发生什么
在接受采访时被问到。 如果指定的最大堆大小(Xmx)大于可用RAM,会发生什么? 我也想知道如果指定最小堆大小(Xms)大于可用RAM会发生什么?
最简单的方法是尝试并查看。
编辑:问题实际上至少有两个答案。 可能在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将再次失败并出现错误。
没什么戏剧性的
虽然某些低端嵌入式系统可能会发生这种情况,但现在很少见到非虚拟Java环境,即使在嵌入式系统中也是如此,在桌面或服务器上也是如此。
因此,没有任何戏剧性的事情会发生,但是一旦你耗尽了可用的RAM,分配额外的(虚拟)内存只会不必要地延迟回收(垃圾收集)并导致程序开始分页 。
如果严重,这种情况称为“ 颠簸 ”,这不是一件好事。 东西会慢慢运行。