如果指定最大堆大小大于可用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,分配额外的(虚拟)内存只会不必要地延迟回收(垃圾收集)并导致程序开始分页

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