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事件) | 这个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、复制和清理阶段之后
那些选择收集的区域,存活对象会被压缩到图中标注的深蓝色区域和深绿色区域。
最后,我们可以总结一下关于老年代GC的结果关键点:
- 并行标记阶段
- 活跃度信息的计算,是和应用并发执行的
- 这个活跃度信息用于决定在一个暂停时间内,那些区域是最适合回收的。
- 这里不有像CMS那样的一个清理(Sweeping)阶段.
- 重新标记阶段
- 使用比CMS快的开始前快照snapshot-at-the-beginning(SATB)
- 完全空的区域被回收
- 复制和清理阶段
- 年轻代和老年代的回收是同时进行的
- 老年代的回收是根据它的活跃度
除非注明,赵岩的博客文章均为原创,转载请以链接形式标明本文地址
本文地址:https://zhaoyanblog.com/archives/433.html