有人可以解释一下 G1 垃圾收集器是如何工作的吗?我还没有在任何地方找到任何全面、易于理解的描述。
谢谢
收集器将堆分成固定大小的区域并跟踪这些区域中的实时数据。它保留了一组指针——“记忆集”——进出该区域。当认为有必要进行 GC 时,它首先收集实时数据较少的区域(因此,“垃圾优先”)。通常,这可能意味着一步收集整个区域:如果指向某个区域的指针数量为零,则不需要对该区域进行标记或扫描。
对于每个区域,它会跟踪各种指标,这些指标描述了收集它们需要多长时间。您可以给它一个关于暂停时间的软实时约束,然后它会尝试在该受限时间内尽可能多地收集垃圾。
有 JavaOne 谈论 G1 和一些关于该主题的文章:
在这个新的 JavaOne 2012 会议中也很好地解释了 G1:G1 垃圾收集器性能调整 [ youtube ]、[ PDF ]。
他们首先介绍了 CMS 和 G1,它们的比较,然后解释了 G1 分析和调整。
G1特性
典型的 G1 堆可能如下所示:
以下是每个 G1 阶段的摘要:
1.1年轻阶段——Minor GC
1.2年轻/初始标记
2.1初始标记- 见 1.2。
2.2 GC备注
2.3. GC 暂停(混合)
请注意,G1 旨在尽可能避免 Full GC。从 Java 7u40 开始,G1 中的 FullGC 暂停没有优化,而是作为单线程操作实现的。使用 G1 时,尽量避免 Full GC - 如果您看到任何 FullGC 暂停,您的 GC 设置可能需要一些调整。
我发现Oracle在这方面的页面非常有助于以易于理解的方式解释这些概念,而且不会太冗长。