垃圾收集器是否保证在Out of Memory Error之前运行?

m3t*_*man 18 java memory garbage-collection jvm out-of-memory

如果堆已满,JVM会抛出一个 OutOfMemoryError.但是它确保在抛出这样的异常之前总是发生(完全)垃圾收集吗?

这意味着当抛出异常时,内存只有强引用对象(或GC Roots可达)才能满.

编辑:假设Sun JVM - HotSpot正在讨论中.

ass*_*ias 21

Java的机器规格在6.3节规定(重点煤矿):

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

因此,JVM确实保证它会在抛出OOME之前尝试通过垃圾收集释放内存.


Pet*_*rey 12

车库收集器通常会在抛出OutOfMemoryError之前运行.但是,如果你没有GC,你可能会得到一个OOME

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


jar*_*bjo 7

您无法保证已执行完整的垃圾收集,但VM已尝试通过垃圾收集提供足够的内存.您可能已经在OutOfMemoryError类API文档中找到了:

当Java虚拟机因内存不足而无法分配对象时抛出,垃圾收集器不再提供更多内存.

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