年轻一代的垃圾收集问题



当伊甸园空间年轻一代满员时,将触发小GC。在次要的 GC 过程中,Eden 中的非自由对象和一个源幸存者空间将被复制到另一个目标幸存者空间。

我的问题是,如果目标幸存者空间已满,次要 GC 如何处理?

如果无法执行/完成次要集合,则执行主要/完整收集。 这通常是使用标记-扫描-紧凑算法而不是复制算法来完成的......这就是为什么完整收藏很昂贵的原因之一。

但最终(如果您继续填充堆)完整的集合将无法回收足够的空间来继续,并且将抛出 OOME。 (或者,如果您使用的是 -XX:+UseGCOverheadLimit ,当在 GC 中花费的时间百分比超过指定阈值时,将抛出 OOME。

年轻一代有 3 个部分伊甸空间、幸存者 1 和幸存者 2。这些只是年轻一代的逻辑划分。因此,物体从伊甸空间复制到幸存者1,然后复制到幸存者2。

因此,一般而言,次要收集意味着收集发生在年轻一代。如果年轻一代是满的,那么对象就会被复制到老一代。

同样,收藏是次要的还是主要的取决于多种因素,其中之一是年轻一代的空间可用性。因此,如果年轻一代有足够的空间用于对象分配,那么它将是次要集合。但是,如果 YG 中没有足够的可用空间,那么相同的集合可能会变成主要集合。

此外,JVM规范没有谈论垃圾收集。因此,JVM实现者可以拥有自己的策略。

最新更新