Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?

CMS(Concurrent Mark-Sweep)和 G1(Garbage-First)垃圾收集器是两种低延迟的垃圾回收器,它们通过并发阶段与应用线程(Mutator)同时运行,以减少暂停时间。为了维持并发垃圾回收的正确性,二者采取了不同的技术和策略。


1. CMS 垃圾收集器的并发正确性维护

1.1 基本工作原理

CMS 使用“标记-清除”算法,主要阶段包括:

  1. 初始标记(STW):标记 GC Roots。
  2. 并发标记:从 GC Roots 开始,遍历对象图,标记所有可达对象。
  3. 重新标记(STW):处理并发标记过程中新产生的引用变化。
  4. 并发清理:清理未标记的垃圾对象。

1.2 并发正确性维护方法

  • 写屏障(Write Barrier)

    • 在 Mutator 修改引用关系时,记录修改到一个“卡表”(Card Table)或“脏卡”列表。
    • 确保并发标记阶段的新引用可以被重新标记阶段捕获。
  • 增量更新(Incremental Update)

    • Mutator 在标记阶段修改了指向未标记对象的引用,CMS 会将新创建的引用加入到待标记队列。
  • Stop-The-World 重新标记

    • 通过短暂停顿扫描卡表中的脏卡,捕获并发标记期间可能遗漏的引用变化,确保标记阶段的准确性。

2. G1 垃圾收集器的并发正确性维护

2.1 基本工作原理

G1 使用“标记-整理”算法,将堆分为多个固定大小的分区(Region),垃圾回收按分区优先级进行。主要阶段包括:

  1. 初始标记(STW):标记 GC Roots。
  2. 并发标记:从 GC Roots 遍历对象图,标记可达对象。
  3. 最终标记(STW):处理并发标记阶段的引用变化。
  4. 清理与整理:回收垃圾对象,并压缩分区。

2.2 并发正确性维护方法

  • SATB(Snapshot-At-The-Beginning)

    • G1 使用 SATB 技术维持并发标记的正确性。
    • 在标记开始时,记录 Mutator 的对象状态快照,而不是跟踪所有引用的变化。
    • Mutator 如果删除了对象的引用,被删除的对象仍会被视为可达,从而保证并发标记阶段不遗漏。
  • 写屏障(Write Barrier)

    • 在对象的引用发生变化时,通过写屏障将旧引用添加到 SATB 的缓冲区中。
    • 确保即使 Mutator 修改了对象图,回收器仍能完整标记。
  • 最终标记(Final Remark)

    • 在并发标记结束后,通过短暂停顿处理 SATB 缓冲区中的变更记录,确保标记结果一致。

3. CMS 和 G1 在并发正确性上的比较

特性 CMS G1
算法 标记-清除 标记-整理
引用变化的处理 增量更新(Incremental Update) 快照集(SATB)
写屏障 修改引用时记录脏卡 修改引用时记录旧引用
额外的 STW 停顿 重新标记阶段 最终标记阶段
并发标记的正确性保障 卡表记录脏区域,重新扫描 SATB 缓冲区记录引用变化
实现复杂性 相对较低 较高

4. 总结

  • CMS通过增量更新和卡表记录引用变化,使用重新标记阶段来确保并发标记的正确性。它更简单,但会有内存碎片和“Concurrent Mode Failure”问题。
  • G1通过 SATB 快照机制记录标记起点的状态,结合最终标记阶段的补充处理,确保并发标记的准确性。G1 的实现更复杂,但其分区化设计和整理过程能够有效减少内存碎片,适合大堆和低延迟场景。

Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?的更多相关文章

  1. Java中基于HotSpot虚拟机的垃圾收集器

    名称 过程 优缺点 Serial 进行垃圾收集时,必须暂停其他所有的工作进程,直到它收集结束.是一个单线程收集器. Stop the world. 新生代收集器. 手工设置新生代的大小:-Xmn Ed ...

  2. G1 垃圾收集器入门

    最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...

  3. 转 G1垃圾收集器入门

    转自:http://blog.csdn.net/zhanggang807/article/details/45956325 最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的 ...

  4. G1垃圾收集器入门-原创译文

    G1垃圾收集器入门-原创译文 原文地址 Getting Started with the G1 Garbage Collector 概览 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot ...

  5. G1 垃圾收集器架构和如何做到可预测的停顿(阿里)

    CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿里面试官的一个问题:众所周期,G1跟其他的垃圾回收算 ...

  6. Java垃圾收集器——Serial,Parallel,CMS,G1收集器概述

    1.概述 Java应用启动的时候,除了配置Xms以及Xmx参数(Xmx:InitialHeapSize, Xms:MaxHeapSize),还需要选择合适的垃圾收集器. 截止Jdk1.8,共提供了7款 ...

  7. 深入理解 Java G1 垃圾收集器--转

    原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...

  8. G1垃圾收集器和CMS垃圾收集器 (http://mm.fancymore.com/reading/G1-CMS%E5%9E%83%E5%9C%BE%E7%AE%97%E6%B3%95.html#toc_8)

    参考来源 JVM 体系架构 堆/栈的内存分配 静态和非静态方法的内存分配 CMS 回收算法 应用场景 CMS 垃圾收集阶段划分(Collection Phases) CMS什么时候启动 CMS缺点 G ...

  9. 【JVM】7、深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

  10. 转:深入理解Java G1垃圾收集器

    本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...

随机推荐

  1. 一文搞懂 结构伪类 :nth-child && :nth-of-typ

    结构伪类 从使用结构伪类的选择器开始 往上一层父辈开始筛选 从使用结构伪类的选择器开始 往上一层父辈开始筛选 从使用结构伪类的选择器开始 往上一层父辈开始筛选 不是从左往右选择 不是先父辈后筛选子类 ...

  2. 报错sql_mode=only_full_group_by

    这个问题的原因是,在这种模式下,sql分组时默认只能select + 分组字段以及聚合函数,相当于做一个规范检查 但很多时候并不需要这个检查,因为真实sql中,分组后很多字段是1对1的,比如分组id, ...

  3. Asp.Net Core3.0 微信转账到零钱

    参考文档: 微信付款到零钱开发文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2 用于向微信用户个人付款, ...

  4. [CERC2014] Parades 题解

    感觉长脑子了. 考虑在路线两端点的 \(lca\) 计算贡献,那么线段可以分两类: \(u\) 为 \(v\) 祖先. \(u,v\) 互不为祖先. 设 \(dp_i\) 表示只考虑 \(i\) 子树 ...

  5. ABB机器人IRB 6700维修保养技巧

    通过与子锐机器人维修保养服务定制合理的机器人保养工作,可以确保ABB机器人IRB 6700的持续稳定运行,延长其使用寿命,为企业的生产提供有力保障. 一.ABB机器人IRB 6700日常检查与维护 外 ...

  6. c# 删除文件夹最快的函数方法 无视占用 直接删除

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/17270147.html 代码如下,直接通过cmd调用dos命令进行删除 public stat ...

  7. Java开发中long类型转换json传递到前端后精度丢失问题

    将文章的id由long类型手动改为String类型(需要修改表结构); 可以使用Jackson进行序列化解决

  8. Typecho获取当前页面加载完成速度时间

    判断当前页面加载是否快速,通常是直接在浏览器中访问网站,看自己的直观感受是否快速.而客观的方法则是计算具体的页面加载时间并显示出来给看. 1.在当前主题的functions.php文件添加下面的代码: ...

  9. Linux - 禁ping & 开放访问端口

    适用于Linux操作系统 禁ping 1.编辑 /etc/sysctl.conf 文件,文件末尾增加如下内容后,保存退出. net.ipv4.icmp_echo_ignore_all = 1 2.在命 ...

  10. AI技术革命,工作效率10个最佳AI工具

    AI技术革命,工作效率10个最佳AI工具 目       录 1.      Vidwud AI PowerPoint生成器... 4 2.      Vidnoz AI音乐视频生成器... 5 3. ...