阿里巴巴|Java8 的 G1相对于之前的 CMS 有什么特别的呢?( 二 )

GC Roots 开始堆中对象进行可达性分析 , 找出存活的对象 , 这个阶段耗时较长 , 但是可以与用户程序并发执行;

  • 最终标记:最终标记和 CMS 的重新标记的思路一直 , 也是为了修正并发标记期间由于用户程序并发运行而导致标记产生变动的那一部分对象 , 不过不同的是 G1 会将这段时间对象变化记录在线程 Remembered Set Logs 里面 , 最终标记阶段需要把 Remembered Set Logs 的数据合并到 Remembered Set 中 , 这个阶段需要停顿线程 , 不过是可并行执行;
  • 筛选回收:最后一步筛选回收是 G1 与 CMS 最大的不同之处 , G1 首先会对各个需要回收的 Region 代价进行量化和排序 , 在结合用户所期望的 GC 停顿时间来制定回收计划 , 通过-XX:MaxGCPauseMillis 参数来指定期望的回收时间 。 这个阶段也可以做到与用户程序一起并发执行 , 但是因为只回收一部分 Region , 时间是用户可控制的 , 而且停顿用户线程将大幅提高收集效率 。
  • 上面提到了一个 Remembered Set 记忆集 , 是用来记录对象引用的 , 在并发标记的时候有对象引用发生变更的时候会记录到这里 , 等到最终标记的时候进行修正 。 整体上来看 G1 采用的是标记-整理的算法来进行垃圾回收 , 也不会像 CMS 那样会产生内容碎片 , 所以 G1 同时可以进行年轻代和老年代的垃圾回收 , 相比 CMS 会更灵活一点 , 而且也因为 G1 将内存划分成 Region 了 , 也不会造成复制算法带来的空间浪费的问题 。
    总结 【阿里巴巴|Java8 的 G1相对于之前的 CMS 有什么特别的呢?】首先CMS 和 G1 都是并发和分代的垃圾回收器 , 并且都是低延迟的;CMS 是基于标记-清除算法的 , 只适合在年轻代使用 , 不可预测停顿时间 , 同时年轻代和老年代是物理隔离的 。 G1 是基于标记-整理的高吞吐 , 可预测停顿时间的垃圾回收器 , 可以同时使用在年轻代和老年代 , 同时年轻代和老年代是逻辑隔离的 。
    特点G1CMS
    算法标记-整理标记-清除
    年轻代和老年代隔离方式逻辑隔离物理隔离
    停顿时间可预测行是否
    并发和分代支持支持
    吞吐量高低
    使用场景年轻代 , 老年代年轻代
    低延时是是
    转自公众号:Java极客技术
    "