如果堆已满,JVM抛出一个OutOfMemoryError
。但是是否可以保证在抛出此类异常之前总是发生(完整的)垃圾回收机制?
这意味着当抛出异常时,只有强引用对象(或GC根可访问)的内存才满。
编辑:假设太阳JVM-热点正在讨论中。
Java机器规范在第6.3节(强调我的)中规定:
OutOfMemoryError
:Java虚拟机实现已用完虚拟或物理内存,自动存储管理器无法回收足够的内存来满足对象创建请求。
因此,JVM确实保证在抛出OOME之前,它会尽力通过垃圾回收机制释放内存。
垃圾收集器通常会在抛出OutOfMemoryError之前运行。但是,如果您
您不能保证已执行完整的垃圾回收机制,但VM已尝试通过垃圾回收机制制造足够的可用存储器。您可以在OutOfMemoryError类的API留档中发现:
当Java虚拟机无法分配对象时引发,因为该对象内存溢出,并且垃圾收集器无法提供更多内存。
请注意,在某些情况下,垃圾收集器可以决定没有足够的内存可用,而无需实际尝试丢弃未引用的对象实例。最明显的例子是,如果您尝试一次分配比最大堆大小更多的内存(例如一个大字节数组)。在这种情况下,可能会在根本没有运行垃圾收集器的情况下引发OutOfMemoryError。