[翻译]G1垃圾收集器(五) 之 G1 GC的步骤(下)

G1的老年代GC

像CMS收集器一样,在老年代的GC上,G1 GC被设计成一个低暂停的收集器。下面的表格描述了G1 GC在老年代上收集的各个阶段。

G1收集阶段-并行标记阶段周期

G1老年代收集的各个阶段如下,请注意有些阶段也是年轻代GC的一部分。

阶段 描述
初始化标记(stop_the_world事件) 这是一个stop_the_world的过程,是随着年轻代GC做的,标记survivor区域(根区域),这些区域可能含有对老年代对象的引用。
根区域扫描 扫描survivor区域中对老年代的引用,这个过程和应用程序一起执行的,这个阶段必须在年轻代GC发生之前完成。
并发标记 查找整个堆中存活的对象,这也是和应用程序一起执行的。这个阶段可以被年轻代的垃圾收集打断。
重新标记(stop-the-world事件) 完成堆内存活对象的标记。使用了一个叫开始前快照snapshot-at-the-beginning (SATB)的算法,这个会比CMS collector使用的算法快。
清理(stop-the-world事件,并且是并发的)
  • 对存活的对象和完全空的区域进行统计(stop-the-world)
  • 刷新Remembered Sets(stop-the-world)
  • 重置空的区域,把他们放到free列表(并发)(译者注:大体意思就是统计下哪些区域又空了,可以拿去重新分配了)
复制(stop-the-world事件) 这个stop-the-world的阶段是来移动和复制存活对象到一个未被使用的区域,这个可以是年轻代区域,打日志的话就标记为 [GC pause (young)]。或者老年代和年轻代都用到了,打日志就会标记为[GC Pause (mixed)]。

G1老年代手机的详细步骤

根据上面的阶段定义,来让我们看看他们都是和老年代怎么交互的。

6、初始化标记阶段
初始化标记,是在年轻代垃圾回收的过程中发生的,在日志中标记为GC pause (young)(inital-mark).

G1 GC 老年代

7、并发标记阶段

如果空的区域发现(图中标记为“X”),他们就会在重新标记阶段被立即清除掉,同时决定活跃度的统计信息也会计算到。

G1 GC老年代

8、重新标记
空的区域被删除回收,同时计算所有区域的区域活跃度

G1 GC老年代

9、复制和清理阶段
G1 GC会选择活跃度最低的区域进行收集,因为这些区域的垃圾收集会更快一点,在收集的过程中,年轻代的GC也可能同时发生,所以在GC的日志中标记为 [GC pause (mixed)],意思就是年轻代的GC和老年代的GC可以同时发生。

G1 GC老年代

10、复制和清理阶段之后
那些选择收集的区域,存活对象会被压缩到图中标注的深蓝色区域和深绿色区域。
G1 GC老年代

最后,我们可以总结一下关于老年代GC的结果关键点:

  • 并行标记阶段
    • 活跃度信息的计算,是和应用并发执行的
    • 这个活跃度信息用于决定在一个暂停时间内,那些区域是最适合回收的。
    • 这里不有像CMS那样的一个清理(Sweeping)阶段.
  • 重新标记阶段
    • 使用比CMS快的开始前快照snapshot-at-the-beginning(SATB)
    • 完全空的区域被回收
  • 复制和清理阶段
    • 年轻代和老年代的回收是同时进行的
    • 老年代的回收是根据它的活跃度

留言

提示:你的email不会被公布,欢迎留言^_^

*

验证码 *