Garbage-First垃圾收集器如何工作?

时间:2010-05-21 12:02:31

标签: java garbage-collection g1gc

有人可以解释G1垃圾收集器的工作原理吗?我无法在任何地方找到任何全面,易于理解的描述。

由于

3 个答案:

答案 0 :(得分:41)

收集器将堆分成固定大小的区域并跟踪这些区域中的实时数据。它保留了一组指针 - “记忆集” - 进出该地区。当认为有必要时,它首先收集具有较少实时数据的区域(因此,“垃圾优先”)。通常,这可能意味着一步收集整个区域:如果指向区域的指针数为零,则不需要对该区域进行标记或扫描。

对于每个地区,它会跟踪各种指标,这些指标描述了收集它们需要多长时间。你可以给它一个关于暂停时间的软实时约束,然后尝试在那个受约束的时间内收集尽可能多的垃圾。

有JavaOne谈论G1和关于这个主题的文章很少:

答案 1 :(得分:30)

在新的JavaOne 2012会话中也很好地解释了G1: G1垃圾收集器性能调整 [youtube],[PDF]。

他们首先介绍CMS和G1,他们的比较,然后解释G1分析和调整。

G1特征

  • 固定大小区域 - 堆分成区域(1Mb - 32MB,~2000,由VM确定)。
  • Eden,幸存者和OldGen代表逻辑区域集
  • 活动对象从一个地区撤离

典型的G1堆可能如下所示:

A typical G1 heap may look like:

以下是每个G1期的摘要:

1。年轻的收藏

1.1 年轻阶段 - 次要GC

  • 疏散 - 世界各地的并行小型GC,将活动对象从Young Generation撤离到Survivor地区(tenuring)或OldGen地区(推广)。
  • 会计 - 下一个年轻GC的伊甸园/幸存者空间的大小是根据每个地区的统计数据并根据应用设置的暂停时间目标确定的。 G1估计下一个YoungGC需要多长时间。
  • 调整大小 - G1现在可以轻松减少/调整eden / survivor区域的大小。

1.2 年轻/初始标记

  • GC年轻初始标记是OldGen集合的初始标记阶段,与YoungGC集合并行执行。初始标记是并行并发标记过程。

2。 Old Gen Collection

2.1 初始标记 - 见1.2。

2.2 GC备注

  • 一站式停顿,标志着活物
  • 会计 - 对于每个区域,在评论期间,G1跟踪区域的 liviness (每个区域中有多少个对象),以及对区域的引用(记忆集) - 这告诉G1在这个区域进行收集需要多长时间。
  • 回收空区域

2.3。 GC暂停(混合)

  • 选择 liviness 较低的地区并收集部分地区。因此,我们正在收集“垃圾第一”。
  • 这些区域的实际集合与下一个Young GC同时执行,因此OldGen的集合有没有单独的暂停。因此, GC暂停(混合)是YoungGen和旧Gen的一部分的混合集合。
  • 在GC暂停(混合)结束时,旧的gen区域可能会留下一些垃圾,这将根据未来的生活,暂停时间目标和未使用区域的数量进行收集。

3。完整的GC

请注意,G1旨在尽可能避免使用Full GC。从Java 7u40开始,G1中的FullGC暂停未经过优化,并且实现为单线程操作。使用G1时,尽量避免使用Full GC - 如果发现任何FullGC暂停,GC设置可能需要进行一些调整。

资源

答案 2 :(得分:0)

我发现Oracle's page对于以可访问的方式解释概念非常有帮助而不会过于冗长。