我试图了解Java中的GC如何工作,并且我想知道在以下情况下会发生什么:
Eden:几乎已满,Surivor1:利用率最低,Surivor2:空,已使用:几乎已满。
我们尝试分配一些对象,该对象不适合Eden的可用空间。
GC启动:尝试将Eden + Survivor1重新打包为Survivor2。大多数对象已删除,但仍然没有足够的空间。溢出会尝试转到终身制。
租用地也没有足够的空间来容纳所有溢出物。
此时,在删除死对象之后,伊甸园可能已经有足够的空间。 Java GC可以利用此可用空间吗?
在这个问题上我没有考虑使用G1垃圾收集器。
答案 0 :(得分:1)
在您描述的情况下,典型的GC算法(因为您不询问特定算法)会导致大型GC尝试回收旧一代中的空间(使用权空间)以允许从中提升对象伊甸园/幸存者空间。
如果这不能回收足够的空间来支持年轻一代的GC完成,您将获得OutOfMemoryException。