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

Java 是否保证垃圾收集器在内存不足错误之前运行?,java,memory,garbage-collection,jvm,out-of-memory,Java,Memory,Garbage Collection,Jvm,Out Of Memory,如果堆已满,JVM将抛出 . 但是,在抛出这样一个异常之前,是否保证(完全)垃圾收集总是发生 这意味着当抛出异常时,内存中只有强引用的对象(或GC根可以访问的对象)是满的 编辑:假设Sun JVM-HotSpot正在讨论中 无法保证OutOfMemoryError之前的最后一个操作是垃圾收集。很可能不会,因为垃圾收集会减少使用的内存量,而不是增加它。垃圾收集器通常会在抛出OutOfMemory错误之前运行。但是,如果您需要,您可能会得到一个没有GC的OOME 尝试创建一个非常大的对象(例如,比

如果堆已满,JVM将抛出 . 但是,在抛出这样一个异常之前,是否保证(完全)垃圾收集总是发生

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


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

无法保证
OutOfMemoryError
之前的最后一个操作是垃圾收集。很可能不会,因为垃圾收集会减少使用的内存量,而不是增加它。

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

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

不能保证已执行完整的垃圾收集,但VM已尝试通过垃圾收集提供足够的内存。您可以在中找到:

当Java虚拟机由于内存不足而无法分配对象,并且垃圾收集器无法提供更多内存时引发


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

< P>除了人们已经回答的以外,还有其他的因素要考虑,例如您正在使用的垃圾回收策略。考虑吞吐量垃圾收集,如果花费太多的时间收集而内存不足,则释放内存不足(尽管最近的更改可能已经改变了事情)。说到这里,我不会假设在我正在编写的应用程序执行过程中的任何时候都会发生垃圾收集…

重点(我的):

OutOfMemoryError
:Java虚拟机实现的内存不足 虚拟内存或物理内存,且自动存储管理器无法运行 回收足够的内存以满足对象创建请求


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

在java中,这是一个“内存不足错误”@a.R.S.:当我看到“outofmemoryexception”标记的注释时,我注意到了这一点,它引用了.NET。我已经编辑了,谢谢你的通知。我很好奇你为什么问这个问题(不是说这不合理,而是为了了解你在考虑什么)@chiccodoro:当调用一个从内存中的DB中获取太多数据的方法时,抛出OutOfMemoryError。通过多次调用同一方法(在循环中)并分页,如果GC在后续调用之间不运行,或者GC在抛出错误之前确实运行,是否会抛出相同的错误?@methodman,非常感谢!在这种情况下,有可能从2GB堆中,可能0.5GB由无法访问的对象组成,并且抛出OutOfMemoryError,即使从我(程序员)的POV中,堆的1/4是空闲的。你能提供一些参考吗?“很可能不会,因为垃圾收集会减少使用的内存量,而不是增加它”,除非没有可回收的内存。。。关于SO的几个答案似乎正好相反(即JVM将在抛出OOE之前尝试使用GC释放资源)。