GC算法之G1算法

G1 算法

G1 在 1.9 版本后成为 JVM 的默认垃圾回收算法,G1 的特点是保持高回收率的同时,减少停顿。

G1 算法取消了堆中年轻代与老年代的物理划分,但它仍然属于分代收集器。G1 算法将堆划分为若干个区域,称作 Region,如下图中的小方格所示。一部分区域用作年轻代,一部分用作老年代,另外还有一种专门用来存储巨型对象的分区。

 

GC算法之G1算法_第1张图片      

G1 也和 CMS 一样会遍历全部的对象,然后标记对象引用情况,在清除对象后会对区域进行复制移动整合碎片空间。

G1 回收过程如下。

  1. G1 的年轻代回收,采用复制算法,并行进行收集,收集过程会 STW。

  2. G1 的老年代回收时也同时会对年轻代进行回收。主要分为四个阶段:

    1. 依然是初始标记阶段完成对根对象的标记,这个过程是STW的;

    2. 并发标记阶段,这个阶段是和用户线程并行执行的;

    3. 最终标记阶段,完成三色标记周期;

    4. 复制/清除阶段,这个阶段会优先对可回收空间较大的 Region 进行回收,即 garbage first,这也是 G1 名称的由来。

G1 采用每次只清理一部分而不是全部的 Region 的增量式清理,由此来保证每次 GC 停顿时间不会过长。

总结如下,G1 是逻辑分代不是物理划分,需要知道回收的过程和停顿的阶段。此外还需要知道,G1 算法允许通过 JVM 参数设置 Region 的大小,范围是 1~32MB,可以设置期望的最大 GC 停顿时间等。有兴趣读者也可以对 CMS 和 G1 使用的三色标记算法做简单了解。

你可能感兴趣的:(JavaSE,面试)