Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
Java 中的 CMS 和 G1 垃圾收集器如何维持并发的正确性?
CMS(Concurrent Mark-Sweep)和 G1(Garbage-First)垃圾收集器是两种低延迟的垃圾回收器,它们通过并发阶段与应用线程(Mutator)同时运行,以减少暂停时间。为了维持并发垃圾回收的正确性,二者采取了不同的技术和策略。
1. CMS 垃圾收集器的并发正确性维护
1.1 基本工作原理
CMS 使用“标记-清除”算法,主要阶段包括:
- 初始标记(STW):标记 GC Roots。
- 并发标记:从 GC Roots 开始,遍历对象图,标记所有可达对象。
- 重新标记(STW):处理并发标记过程中新产生的引用变化。
- 并发清理:清理未标记的垃圾对象。
1.2 并发正确性维护方法
写屏障(Write Barrier):
- 在 Mutator 修改引用关系时,记录修改到一个“卡表”(Card Table)或“脏卡”列表。
- 确保并发标记阶段的新引用可以被重新标记阶段捕获。
增量更新(Incremental Update):
- Mutator 在标记阶段修改了指向未标记对象的引用,CMS 会将新创建的引用加入到待标记队列。
Stop-The-World 重新标记:
- 通过短暂停顿扫描卡表中的脏卡,捕获并发标记期间可能遗漏的引用变化,确保标记阶段的准确性。
2. G1 垃圾收集器的并发正确性维护
2.1 基本工作原理
G1 使用“标记-整理”算法,将堆分为多个固定大小的分区(Region),垃圾回收按分区优先级进行。主要阶段包括:
- 初始标记(STW):标记 GC Roots。
- 并发标记:从 GC Roots 遍历对象图,标记可达对象。
- 最终标记(STW):处理并发标记阶段的引用变化。
- 清理与整理:回收垃圾对象,并压缩分区。
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 垃圾收集器如何维持并发的正确性?的更多相关文章
- Java中基于HotSpot虚拟机的垃圾收集器
名称 过程 优缺点 Serial 进行垃圾收集时,必须暂停其他所有的工作进程,直到它收集结束.是一个单线程收集器. Stop the world. 新生代收集器. 手工设置新生代的大小:-Xmn Ed ...
- G1 垃圾收集器入门
最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的找到一篇写的很棒的文章,粘过来mark下.总结这篇文章和其他的资料,G1可以基本稳定在0.5s到1s左右的延迟,但是并不能保 ...
- 转 G1垃圾收集器入门
转自:http://blog.csdn.net/zhanggang807/article/details/45956325 最近在复习Java GC,因为G1比较新,JDK1.7才正式引入,比较艰难的 ...
- G1垃圾收集器入门-原创译文
G1垃圾收集器入门-原创译文 原文地址 Getting Started with the G1 Garbage Collector 概览 目的 本文介绍了如何使用G1垃圾收集器以及如何与Hotspot ...
- G1 垃圾收集器架构和如何做到可预测的停顿(阿里)
CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿里面试官的一个问题:众所周期,G1跟其他的垃圾回收算 ...
- Java垃圾收集器——Serial,Parallel,CMS,G1收集器概述
1.概述 Java应用启动的时候,除了配置Xms以及Xmx参数(Xmx:InitialHeapSize, Xms:MaxHeapSize),还需要选择合适的垃圾收集器. 截止Jdk1.8,共提供了7款 ...
- 深入理解 Java G1 垃圾收集器--转
原文地址:http://blog.jobbole.com/109170/?utm_source=hao.jobbole.com&utm_medium=relatedArticle 本文首先简单 ...
- 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 ...
- 【JVM】7、深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
- 转:深入理解Java G1垃圾收集器
本文首先简单介绍了垃圾收集的常见方式,然后再分析了G1收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践. 一,什么是垃圾回收 首先,在了解G1之前,我们需要清楚的知道,垃圾回收是什么 ...
随机推荐
- HTB Builder walkthrough
nmap nmap -sS -A -T4 10.10.11.10 Starting Nmap 7.95 ( https://nmap.org ) at 2025-01-20 01:31 UTC Nma ...
- 《SpringBoot》EasyExcel实现百万数据的导入导出
24年11月6日消息,阿里巴巴旗下的Java Excel工具库EasyExcel近日宣布,将停止更新,未来将逐步进入维护模式,将继续修复Bug,但不再主动新增功能. EasyExcel 是一款知名的 ...
- 玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!
本文分享自天翼云开发者社区<玩转云端|演唱会一票难求?快用天翼云边缘安全加速平台AccessOne!>,作者:天翼云社区官方账号 Super Idol的笑容虽然非常甜 无数粉丝宝宝的心里却 ...
- Linux mint安装百度云
deb包下载 BCloud 作者官网https://github.com/XuShaohua/bcloud-packages 链接: https://pan.baidu.com/s/1hskY04G ...
- Codeforces 1110D Jongmah 题解 [ 蓝 ] [ 线性 dp ] [ 观察 ]
Jongmah:小清新麻将 dp 题. 观察 首先观察这两个操作的性质,不难发现我们出掉的所有的顺子只要累计出了三次,这三次顺子就一定可以化作出三次相同的单牌. 而我们只需要最大化操作次数,显然这三次 ...
- FreeSql学习笔记——8.数据返回类型
前言 FreeSql数据返回格式比较丰富,包括单条.列表.导航属性数据.指定字段.Dto等:可以有效的减少代码量,减少字段复制等操作: 前面的查询已经用到了日常基本需要用到的数据格式,本篇是常 ...
- 2023LN省选游记
前言 CSP第一轮都考完了,我才写这个游记.我真懒惰 书接上回 正文 Day -114514 我也没想到我居然能报省选. 报上了.准备去爆零. Day -114513~Day -1 学习暴力算法以及痛 ...
- GIT如何进行团队协作
加入其他开发成员.修改代码并提交 选择库点击管理 点击添加成员邀请用户 以下三种方式都行 加入后如下 第二人如何进行修改文件: 在文件夹中创建本地库git init 建立远程连接 git remote ...
- 【COM3D2Mod 制作教程(1)】教程简介
[COM3D2Mod 制作教程(1)]教程简介 教程来自:https://bdffzi.github.io/opencom3d2/#/Research/MakeMod(含配套视频) 前言 没有Mod ...
- Jupyter Notebook 一些常用的快捷键
命令模式(按 Esc 进入): A:在当前单元格上方插入新单元格. B:在当前单元格下方插入新单元格. D + D(按两次 D 键):删除当前单元格. Z:撤销单元格删除. Ctrl + Enter: ...