在考虑了很长时间提出这个问题的通用方法(但没有找到)之后,我只是想把它作为一个具体的例子来问:
假设我有一台 Linux 机器,它有 1 Gb 的内存,它可以分配给进程(物理和交换总计 1 Gb)。
我在机器上安装了标准的 Oracle Hotspot JVM 版本 7。如果在给定的时刻,有足够多的程序在运行,以至于 1 Gb 中只有 400 Mb 是空闲的,我会在那个时刻使用以下 JVM 标志启动一个 Java 程序:
java -Xms256m -Xmx512m -jar myJar.jar
发生了什么事? :
A. JVM 是否无法立即启动,因为它会尝试分配所有 512 Mb 内存并失败(由于此时没有足够的可用内存)?
如果 JVM 启动:
如果在某个时候运行的 Java 进程需要超过 400 Mb 的内存(除了当前 Java 进程已经使用的内存之外,仍然只有 400 Mb 的内存是空闲的),将会发生什么:
B. Java 进程会因 OutOfMemroyError 而失败吗?
C. 它会因其他(标准)错误而失败吗?
D. 是未定义的行为吗?
原文由 Shivan Dragon 发布,翻译遵循 CC BY-SA 4.0 许可协议
-Xmx 只是定义堆的最大大小。它不能保证是否有这么多内存。它只确保堆永远不会大于给定值。也就是说,选项 B.) 将会发生,将抛出 outOfMemoryError。