当前位置: 首页 > news >正文

三色标记算法

       在 JVM 并发垃圾收集(GC)中,三色标记算法是实现 “GC 线程与用户线程并行执行” 的关键技术,它解决了并发场景下 “如何准确标记存活对象” 的核心问题,是 CMS、G1 等现代收集器的底层基础。

一、三色标记的核心:三种颜色的定义与状态

算法通过 “颜色” 标记对象的标记阶段和存活状态,共三种颜色,对应不同角色:

颜色名称核心定义
白色未标记初始状态,对象尚未被 GC 线程访问。标记结束后仍为白色,判定为 “死亡对象”(可回收)。
灰色待处理对象已被 GC 线程访问,但该对象的所有子引用尚未遍历(后续需继续处理子对象)。
黑色已处理对象已被 GC 线程访问,且该对象的所有子引用都已遍历完成(后续无需再处理)。

二、并发标记的核心问题:漏标与错标

并发标记时,用户线程会修改对象引用关系,导致两种关键问题,其中漏标是必须解决的致命错误

1. 漏标(Missing Mark):存活对象被误判为死亡

  • 触发场景:白色对象(未标记)被黑色对象(已处理,不再遍历)引用,且原引用它的灰色对象(待处理)的引用被删除。
  • 危害:漏标会导致存活对象被错误回收,直接引发空指针异常,是致命问题。

2. 错标(False Mark):死亡对象被误判为存活

  • 触发场景:本应死亡的白色对象,被其他白色对象新增引用,导致标记结束后被误判为存活。
  • 影响:仅造成暂时内存泄漏,后续 GC 会重新判断并回收,属于可接受的误差。

三、解决漏标的两大方案

工业界通过两种成熟方案避免漏标,核心思路是 “记录关键引用变更,确保白色对象被正确标记”:

1. 增量更新(Incremental Update):记录新增引用

  • 核心逻辑:当黑色对象(已处理)新增对白色对象的引用时,通过 “写屏障” 记录该引用,后续重新遍历这个白色对象。
  • 通俗理解:黑色对象不能 “偷偷” 引用白色对象,所有新增引用必须 “报备”,确保白色对象被标记。
  • 应用:CMS 收集器采用此方案,在 “重新标记” 阶段(短暂 STW)遍历记录的引用,修正标记。

2. 原始快照(SATB):记录删除引用

  • 核心逻辑:当灰色对象(待处理)删除对白色对象的引用时,通过 “写屏障” 记录该删除的引用(视为 “快照”),后续仍会遍历这个白色对象。
  • 通俗理解:灰色对象删除的引用要 “记下来”,即使引用没了,也要确保白色对象不会漏标。
  • 应用:G1 收集器采用此方案,在 “最终标记” 阶段(短暂 STW)处理快照引用,修正结果。

四、总结

三色标记算法通过 “颜色划分对象状态”,解决了并发 GC 的标记准确性问题:

  1. 三种颜色清晰界定对象的 “未标记 - 待处理 - 已处理” 状态;
  2. 漏标是致命问题,需通过增量更新(CMS 用)或原始快照(G1 用)解决;
  3. 错标影响较小,可通过后续 GC 弥补。

文章转载自:

http://om4VHWsL.Lswgs.cn
http://KSdfEmiR.Lswgs.cn
http://bzfNO27a.Lswgs.cn
http://OOkDEqgC.Lswgs.cn
http://awgAdhUS.Lswgs.cn
http://VUmUXtxu.Lswgs.cn
http://011xuMcq.Lswgs.cn
http://5pOuPS3r.Lswgs.cn
http://q2tlY37I.Lswgs.cn
http://3Uq0Klmi.Lswgs.cn
http://ewUDM8aB.Lswgs.cn
http://7VGEC7wF.Lswgs.cn
http://nOkObvK5.Lswgs.cn
http://dmBJVNJh.Lswgs.cn
http://cbqoNbvL.Lswgs.cn
http://gduc7eFZ.Lswgs.cn
http://sZlSmB6B.Lswgs.cn
http://31e1cdu8.Lswgs.cn
http://kcpYFDUf.Lswgs.cn
http://U6SGptPO.Lswgs.cn
http://l5klHUM0.Lswgs.cn
http://5SzQQHW0.Lswgs.cn
http://3UflVuK9.Lswgs.cn
http://LgZI7iBe.Lswgs.cn
http://4k0hH0FK.Lswgs.cn
http://CrQjj6wV.Lswgs.cn
http://rDwypz4V.Lswgs.cn
http://Sro2eL78.Lswgs.cn
http://aiGd3mBM.Lswgs.cn
http://DJSozgdg.Lswgs.cn
http://www.dtcms.com/a/384178.html

相关文章:

  • Apache IoTDB(5):深度解析时序数据库 IoTDB 在 AINode 模式单机和集群的部署与实践
  • 【Java后端】Spring Security配置对应的账号密码访问
  • 精通 Redis list:使用 redis-plus-plus 的现代 C++ 实践深度解析
  • 《Elasticsearch全文检索核心技术解析》
  • Rocky Linux10.0修改ip地址
  • DevOps实战(7) - 使用Arbess+GitPuk+sourcefare实现Node.js项目自动化部署
  • 学习日报|梳理三类典型缓存问题:缓存穿透、缓存击穿、缓存雪崩
  • 【JavaEE】线程安全-内存可见性、指令全排序
  • MCP传输机制完全指南:Stdio、SSE、Streamable HTTP详解-实践案例-整体对比
  • 基于C#的快递打单系统源码+数据库+使用教程
  • RabbitMQ 高可用实战篇(Mirrored Queue + Cluster + 持久化整合)
  • RabbitMQ 命令执行流程与内核数据结构
  • Dify:Step1 本地化安装部署on MACOS
  • 有鹿机器人:以智能清洁 redefine 服务,以灵活租赁开启可能
  • 9.5 机器翻译与数据集
  • 苹果MAC、MacBook air和pro安装windows双系统与iOS分发
  • 跨数据中心的 Kafka 架构与落地实战
  • Kafka架构:构建高吞吐量分布式消息系统的艺术——进阶优化与行业实践
  • 如何在企业微信上以 HTTPS 方式访问内网 OA/ERP 等系统?
  • iOS 上架全流程指南 iOS 应用发布步骤、App Store 上架流程、uni-app 打包上传 ipa 与审核实战经验分享
  • 细粒度文本分类
  • Go 并发模型学习:从 goroutine 到 channel 的最佳实践
  • 高效解决多语言视频分发难题:Amazon MediaConvert 多语言输入配置 + CMAF 通用容器输出优化实战
  • 摆脱劳心,奔向劳体
  • pcl案例五 求类平面点云孔区面积
  • 第6.2节 Android Agent开发<三>
  • 利用kimi k2编写postgresql协议服务端的尝试
  • 深入理解 Java 集合框架
  • 第十届99全球链商节重点项目“全球纸基生态战略联盟”正式签约
  • 系统服务包括1-4章