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之前,我们需要清楚的知道,垃圾回收是什么 ...
随机推荐
- 拥有自己的解析器(C#实现LALR(1)语法解析器和miniDFA词法分析器的生成器)
拥有自己的解析器(C#实现LALR(1)语法解析器和miniDFA词法分析器的生成器) 参考lex和yacc的输入格式,参考虎书<现代编译原理-C语言描述>的算法,不依赖第三方库,大力整合 ...
- Java开发自学第一天
Java学习日志 Day 01|2025/2/11|累计1天 今日学习时长 6小时 当日学习目标 1.了解JVM.JDK.JRE 2.学习Idea开发工具的基本使用 3.基本语法:运算符.数据类型.变 ...
- 用python做时间序列预测三:时间序列分解
在初始概念篇中,我们简单提到了时间序列由趋势.周期性.季节性.误差构成,本文将介绍如何将时间序列的这些成分分解出来.分解的使用场景有很多,比如当我们需要计算该时间序列是否具有季节性,或者我们要去除该时 ...
- 面试官:谈谈RabbitMQ的队头阻塞问题?
RabbitMQ 延迟消息的队头阻塞问题是指,在使用死信队列(DLX)和 TTL(消息过期时间)实现延迟消息时,由于队列的先进先出(FIFO)特性,在队列头部消息未过期的情况下,即使后续消息已经过期也 ...
- ATT&CK实战系列(一)
环境下载 下载靶场环境,并导入虚拟机分别是win2003.win7.winserver2008 配置网络 虚拟机--编辑--虚拟机网络编辑器--添加网络VMnet2--仅主机模式分配的地址是192.1 ...
- [SDOI2009] 晨跑 题解
每个点拆成入点和出点. 发现每个点.每条边都只能经过一次,所以所有边的容量都是 \(1\). #include<bits/stdc++.h> #define ll long long us ...
- 纯离线部署本地知识库LLM大模型
纯离线部署本地知识库LLM大模型 一.下载离线大模型 下载的网址:https://hf-mirror.com/ deepseek qwen 相关的模型,只建议使用1.5B的,GGUF后缀的模型 推荐下 ...
- 数据挖掘 | 数据隐私(3) | 差分隐私 | 差分隐私概论(上)(Intro to Differential Privacy 1)
L3-Intro to Differential Privacy 从这节课开始就要介绍差分隐私算法了. 随机响应(Randomized Response) 场景提出 假若你是某一门课的教授,你希望统计 ...
- 【C#语法糖 Lambda】2 - 表达式树与LINQ
一.声明 曾经遇到一个这样的场景: GetEntities(a => a.OrderKindCodeId == 16 && a.IsDeleted, this.DefaultCo ...
- Netty基础—4.NIO的使用简介
大纲 1.Buffer缓冲区 2.Channel通道 3.BIO编程 4.伪异步IO编程 5.改造程序以支持长连接 6.NIO三大核心组件 7.NIO服务端的创建流程 8.NIO客户端的创建流程 9. ...