是否有可能获得OutOfMemoryError,因为垃圾收集太慢了?

Jac*_*hen 11 java garbage-collection out-of-memory

在java中,你是否有可能得到一个OutOfMemoryError异常,即使应该有足够的内存应该垃圾收集释放更多的内存?换句话说,如果没有足够的内存来分配,在抛出OutOfMemoryError之前是否会强制gc运行?

谢谢.

fge*_*fge 6

某种情况下,您可能会获得与堆相关或与地址空间无关的OOM:它是在JVM决定GC运行时间过长时.

看到这里.

换句话说,原始问题的答案,即"如果没有足够的内存来分配,将在抛出OutOfMemoryError之前强制执行gc",是的.

(你会从上面的链接看到gc /运行代码的比例是98%/ 2%,这已经非常高了)

(注2:这是针对Sun的/ Oracle的JVM,不知道其他实现)


Per*_*ium 5

你可以得到它,如果GC花费太多时间试图释放内存而不是通过这样做来释放大量内存'java.lang.OutOfMemoryError:GC开销超出限制',请参阅此问题.


Jon*_*eet 1

GC通常OutOfMemoryError在抛出之前尝试查找内存,但我偶尔会看到可重复的示例,其中垃圾收集器无法完全跟上,并且调用可以System.gc()防止异常。

这在很大程度上是一个例外(没有双关语),而不是规则——你几乎永远应该尝试自己引发垃圾收集。