SATB(Snapshot At The Beginning):对比 G1 与 CMS 在并发标记阶段处理漏标问题的算法差异

云雪小哥_6481

云雪小哥_6481

2026-05-19

477人浏览

原创

g1采用satb(起始快照)方案,通过写屏障在引用被覆盖前记录旧值,确保初始标记时存活的对象不被漏标;cms采用增量更新(iu)方案,在黑色对象新增指向白色对象时将其重新标记为灰色,防止新引用导致的漏标。

satb(snapshot at the beginning):对比 g1 与 cms 在并发标记阶段处理漏标问题的算法差异

G1 和 CMS 都采用并发标记,但解决漏标问题的思路根本不同:CMS 用增量更新(IU)“补新引用”,G1 用 SATB “记旧引用”。这不是实现细节差异,而是对“什么该被保护”这件事的哲学分歧。

漏标发生的两个典型路径

并发标记中,GC 线程和业务线程并行运行,对象引用随时可能变化。漏标只发生在白色对象上,且必须满足以下任一条件:

  • 一个已标记为黑色的对象,新增了对某个白色对象的引用
  • 一个灰色对象,删除了对某个白色对象的唯一引用

前者是“新连进来”,后者是“老路断掉了”。CMS 和 G1 分别盯住其中一条路径重点防御。

MAC风格响应式蓝色企业CMS后台管理系统模版
MAC风格响应式蓝色企业CMS后台管理系统模版

MAC风格响应式蓝色企业CMS后台管理系统模版

下载

CMS 的增量更新(IU):拦截新增引用,把白色对象拉回灰色队列

CMS 在写屏障中检测到 黑色对象赋值给白色对象(如 obj.status = new Status()),就立刻将那个白色对象重新标记为灰色,加入扫描队列。它不关心引用是否被删,只确保“新挂上的不能丢”。

  • 每次引用赋值都要走写屏障,开销稳定但略高
  • 不处理“灰色删引用”路径,靠最终标记(Remark)阶段全局重扫卡表兜底
  • Remark 阶段需扫描 dirty card + GC roots,STW 时间易抖动

G1 的 SATB:在引用被覆盖前记录旧值,以初始快照为安全依据

G1 的写屏障只在 已有对象字段被覆写前 触发(如 obj.field = otherObj),把原字段值(可能是 null 或某个老年代对象)压入线程本地的 satb_mark_queue。它不拦新增,专盯“消失”。

  • 仅拦截跨代或涉及收集集的引用赋值,年轻代内赋值通常不触发
  • 依赖初始标记(Initial Mark)阶段的 STW 扫描根集合,形成完整快照起点
  • 最终标记阶段只需处理 SATB 队列里的对象,无需扫全卡表,Remark 更轻量

为什么 SATB 更适合 G1 的设计目标

G1 面向大堆、低延迟场景,要求 STW 尽可能短且可预测。SATB 把标记范围锁死在初始快照,后续只追“被破坏的点”,避免 CMS 那种动态增长的标记工作集。即使应用频繁更新缓存对象字段,只要 SATB 队列不持续积压,整体暂停时间就更平稳。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

cms

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

2023.08.14

6156

4

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

0

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

0

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

0

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

80

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
零基础精通 PS 视频教程
零基础精通 PS 视频教程

共268课时 | 120.1万人学习

前端工程师必备技能—PS切图
前端工程师必备技能—PS切图

共11课时 | 2.2万人学习

麦子学院Photoshop切片视频教程
麦子学院Photoshop切片视频教程

共13课时 | 4.3万人学习