当 JVM 在运行时用完内存分配时会发生什么?

新手上路,请多包涵

在考虑了很长时间提出这个问题的通用方法(但没有找到)之后,我只是想把它作为一个具体的例子来问:

假设我有一台 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 许可协议

阅读 492
2 个回答

-Xmx 只是定义堆的最大大小。它不能保证是否有这么多内存。它只确保堆永远不会大于给定值。也就是说,选项 B.) 将会发生,将抛出 outOfMemoryError。

原文由 Polygnome 发布,翻译遵循 CC BY-SA 3.0 许可协议

假设我有一台 Linux 机器,它有 1 Gb 的内存,它可以分配给进程(物理和交换总计 1 Gb)。

我的第一反应是,除非你在谈论手机,否则我会获得更多内存。您可以用不到 100 美元购买 16 GB(b = 位,B = 字节)。

JVM 是否无法立即启动,因为它会尝试分配所有 512 Mb 内存并失败(由于目前没有足够的可用内存)?

如果您的系统没有 512 MB(加上一些开销),则会发生这种情况,因为它会在启动时分配用于堆的连续虚拟内存。

即使您有 550 MB 的可用空间,该程序也可能无法启动,因为它需要加载的不仅仅是堆。

Java 进程会因 OutOfMemoryError 而失败吗?

如果您的程序在运行时使用 512 MB,则无论您的机器有多少内存,都会发生这种情况。此错误只会在您的 JVM 启动后发生。如果它无法启动,您将不会收到此错误。

它会因其他(标准)错误而失败吗?

如果程序启动后交换空间不足,则可能会发生这种情况。这种情况很少见,只发生在严重超载的机器上。我所看到的是由于低级操作系统无法分配内存而导致 JVM 崩溃。

Java 6 Update 25 VM 崩溃:内存不足

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题