[翻译]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). 7、并发标记阶段 如果空的区域发现(图中标记为“X”),他们就会在重新标记阶段被立即清除掉,同时决定活跃度的统计信息也会计算到。 8、重新标记 空的区域被删除回收,同时计算所有区域的区域活跃度 9、复制和清理阶段 G1 GC会选择活跃度最低的区域进行收集,因为这些区域的垃圾收集会更快一点,在收集的过程中,年轻代的GC也可能同时发生,所以在GC的日志中标记为 [GC pause (mixed)],意思就是年轻代的GC和老年代的GC可以同时发生。 10、复制和清理阶段之后 那些选择收集的区域,存活对象会被压缩到图中标注的深蓝色区域和深绿色区域。 ...