提问者:小点点

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


如果堆已满,JVM抛出一个OutOfMemoryError。但是是否可以保证在抛出此类异常之前总是发生(完整的)垃圾回收机制?

这意味着当抛出异常时,只有强引用对象(或GC根可访问)的内存才满。

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


共3个答案

匿名用户

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

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

因此,JVM确实保证在抛出OOME之前,它会尽力通过垃圾回收机制释放内存。

匿名用户

垃圾收集器通常会在抛出OutOfMemoryError之前运行。但是,如果您

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

匿名用户

您不能保证已执行完整的垃圾回收机制,但VM已尝试通过垃圾回收机制制造足够的可用存储器。您可以在OutOfMemoryError类的API留档中发现:

当Java虚拟机无法分配对象时引发,因为该对象内存溢出,并且垃圾收集器无法提供更多内存。

请注意,在某些情况下,垃圾收集器可以决定没有足够的内存可用,而无需实际尝试丢弃未引用的对象实例。最明显的例子是,如果您尝试一次分配比最大堆大小更多的内存(例如一个大字节数组)。在这种情况下,可能会在根本没有运行垃圾收集器的情况下引发OutOfMemoryError。