垃圾回收器是否保证在内存不足错误之前运行?

如果堆已满,JVM 会抛出一个 OutOfMemoryError。但是,是否可以确保在引发此类异常之前始终进行(完整)垃圾回收?

这意味着在引发异常时,内存仅包含强引用对象(或可由 GC 根目录访问)而已满。

编辑:假设太阳JVM - HotSpot正在讨论中。


答案 1

Java机器规范在第6.3节(强调我的)中指出:

OutOfMemoryError:Java 虚拟机实现的虚拟内存或物理内存已用完,并且自动存储管理器无法回收足够的内存来满足对象创建请求。

因此,JVM确实提供了保证,在抛出OOME之前,它将尝试通过垃圾回收来释放内存。


答案 2

垃圾回收器通常会在抛出内存错误之前运行。但是,如果您没有GC,您可能会得到一个OOME。

  • 尝试创建一个非常大的对象(例如,大于堆)
  • 启动线程,但没有足够的虚拟内存或资源来启动线程。
  • 旧版本的Java如果达到最大直接内存,则会抛出此错误。

推荐