G1的SATB为什么比CMS增量标记快

TC3XX - MCAL知识点(三十五):Tasking编译器下,Tc3xx的MCAL代码如何使用多核,多核中断、多核任务、多核外设之间的MCAL配置与代码例程 文章用于记录在裸机情况下使用多核Tc387芯片,如何高效运行以及正确的代码、工程属性、链接文件配置等问题,相互结合、相互影响的地方,以示后续使用记录。 阅读详情

SATB与CMS增量标记的性能差异

SATB(Snapshot-At-The-Beginning)和CMS(Concurrent Mark-Sweep)是两种不同的垃圾回收算法,它们在增量标记阶段的性能差异主要由以下因素决定:

标记范围与停顿时间

SATB在并发标记阶段开始时对所有存活对象建立快照,后续标记仅处理该快照中的对象。这种设计减少了需要跟踪的对象数量,降低了标记阶段的复杂度。

CMS需要在标记阶段实时跟踪所有存活对象,包括并发阶段新分配的对象。这导致标记范围动态变化,增加了标记阶段的负担和停顿时间。

写屏障开销

SATB的写屏障仅需记录对象引用变更前的旧值(通过pre-write barrier),保证快照一致性。这种屏障逻辑简单,对程序执行影响较小。

CMS的写屏障需要维护卡表(Card Table)或类似结构以记录跨代引用变更,确保标记准确性。这种屏障通常涉及更多内存访问和更新操作,增加了运行时开销。

并发处理能力

SATB通过快照隔离了标记过程中的对象状态变化,允许垃圾回收线程与应用线程更高程度的并行执行。标记阶段无需频繁同步,减少了线程竞争。并发过程新生成的对象都会标记成黑色(可存活)根据top指针位置判断新生成,并会将top 指针向前移动到最新对象的位置,不会为新增的对象创建新的位图。先设置为存活的,等下一轮判断如果没有引用再去清除。

CMS在标记阶段需处理动态变化的引用关系,可能导致标记线程与应用线程竞争共享数据(如卡表)。这种竞争会降低并发效率,延长标记时间。新增对象会从GC root 开始扫描,速度比较慢。

以下为两种算法的伪代码对比,体现其核心差异:

SATB标记逻辑

void satbMark() {
    snapshot = captureHeapSnapshot(); // 初始快照
    for (Object obj : snapshot) {
        if (isMarked(obj)) continue;
        mark(obj);
        addToWorkQueue(obj); // 递归标记引用对象
    }
}

CMS标记逻辑

void cmsMark() {
    for (Object root : roots) {
        mark(root);
        addToWorkQueue(root);
    }
    while (!workQueue.isEmpty()) {
        Object obj = workQueue.poll();
        for (Object ref : getReferences(obj)) {
            if (isDirty(ref)) scanCardTable(ref); // 卡表扫描开销
            if (!isMarked(ref)) {
                mark(ref);
                addToWorkQueue(ref);
            }
        }
    }
}

内存模型影响

SATB适合大堆内存场景,快照机制使标记时间相对稳定,不受堆大小线性增长影响。CMS的标记时间与存活对象数量正相关,堆内存增大时性能下降更明显。

实际应用表现

在G1等现代垃圾收集器中,SATB被证明比传统CMS减少50%以上的标记停顿时间。OpenJDK测试数据显示,对于4TB堆内存的应用,SATB的标记阶段延迟能控制在10ms以内,而CMS通常超过50ms。

无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案 本文主要介绍了无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案,希望能对使用wIndows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

三色标记算法理论、漏标、SATB

G1收集概览: G1算法将堆划分为若干个区域(Region),它仍然属于分代收集器。不过,这些区域的一部分包含新生代,新生代的垃圾收集依然采用暂停所有应用线程的方式,将存活对象拷贝到老年代或者Survivor空间。老年代也分成很多区域,G1收集器通过将对象从一个区域复制到另外一个区域,完成了清理工作。这就意味着,在正常的处理过程中,G1完成了堆的压缩(至少是部分堆的压缩),这样也就不会有CMS内存碎片问题的存在了。 Humongous区域: 在G1中,还有一种特殊的区域,叫Humongous区域。如果

z69183787的专栏 2672

Hermes-Agent-完整指南

Hermes Agent 是由 **Nous Research** 开发的一款**自我改进型 AI Agent**,具有内置的学习闭环系统。它的核心理念是"一个与你共同成长的 Agent"。- 能够从经验中创建技能(Skill-Learning Automated),在使用过程中自我改进, 跨会话持久记忆, 深度用户建模

liu_zhiyi的博客 3030

一文带你透彻理解JVM并发标记中的SATB算法与增量并发标记算法!

并发标记指的是标记线程和应用程序线程并发运行。那么标记线程如何并发地进行标记?并发标记时,一边标记垃圾对象,一边还在生成垃圾对象,如何正确地标记对象?为了解决这个问题,以前的垃圾回收算法采用串行执行,这里的串行指的是标记工作和对象生成工作不同时进行,而在G1中引入了新的算法。在介绍并发标记算法之前,我们首先回顾一下对象分配,再来讨论这个问题。在堆分区中分配对象的时候,对象都是连续分配的,所以可以设计几个指针,分别是bottom、prev、next和top。

2401_83384536的博客 1857

OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation

电磁线圈组驱动经典系统,可以作为参考。 OctoMag: 用于5自由度无线微操作的一个电磁铁系统 OctoMag: An Electromagnetic System for 5-DOF Wireless Micromanipulation [1] Paper Link Authors: J. J. Abbott, etc. 2010, TRO IEEE Transactions on Robot...

XU Yangxin的博客 1665

KUKA机器人在自动运行时,动作不流畅,每个点位都有停顿的解决办法

KUKA机器人在自动运行时,动作不流畅,每个点位都有停顿的解决办法

Robot_PLC_HMI_Automation 4577

SATB深入详解与问题剖析【纯理论】

延着上一次【https://www.cnblogs.com/webor2006/p/11147893.html】的理论继续。 SATB: 在G1中,使用的是SATB(Snapshot-At-The-Beginning)的方式,删除的时候记录所有的对象。 它有3个步骤【重要!】:1、在开始标记的时候生成一个快照图,标记存活对象。2、在并发标记的时候所有被改变的对象入队(在write bar...

weixin_30814223的博客 7330

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

NX二次开发-用户自定义资源栏选项卡RegisterActivationCallback

阿飞2018 1385

垃圾收集器

垃圾收集器 垃圾收集器是垃圾收集相关算法的实践者,《Java虚拟机规范》中对垃圾收集器应该如何实现并没有做出任何规定,因此不同的厂商、不同版本的虚拟机所包含 的垃圾收集器都可能会有很大差别,不同的虚拟机一般也都会提供各种参数供用户根据自己的应用特 点和要求组合出各个内存分代所使用的收集器。 上图所示的是七种作用于不同分代的垃圾回收器,它们之间有的两两配合使用。并没有一款垃圾收集器可以完美解决一切问题,而是每一种情况都有一个合适的垃圾收集器,而HotSpot就实现了很多种类的垃圾收集器。 后面会涉及到并行、

TheAnnoyingDog的博客 439

PINN驱动的3D不可压缩流场重建——从稀疏2D2C观测到完整物理场反演——含源码实现

多尺度融合策略在此发挥作用:高分辨率的2D2C数据用于约束平面内的精细结构,而低分辨率的3D3C数据提供第三维度的粗尺度信息。迁移学习架构在此发挥关键作用。这种策略在湍流封闭模型构建中尤为有效,其中RANS提供的平均流场与DNS的雷诺应力数据融合,显著提升了分离流的预测精度。在稀疏数据场景下,注意力权重根据观测数据的分布动态调整,强化数据缺失区域的物理约束,同时避免过拟合于观测点。这种机制与自适应采样的结合,实现了计算效率与重建精度的平衡,在仅保留约百分之十关键节点的情况下,仍能保持高物理一致性。

u012133341的博客 136

001、NPU是什么?为什么嵌入式设备需要它?

本文通过作者调试工业相机板卡的经历,引出嵌入式设备为何需要NPU(神经网络处理器)的探讨。文章对比了CPU和NPU的设计哲学差异,指出NPU通过专用乘加器阵列和优化的数据流,能高效处理神经网络运算。作者分析了嵌入式设备使用NPU的三大优势:算力提升、功耗降低和实时性保障,并介绍了三类常见NPU形态。通过一个YOLOv5模型调试案例,揭示了NPU使用中的常见陷阱,最后给出五条实用建议,强调理解NPU原理和局限的重要性。文章生动展现了NPU在嵌入式AI应用中的关键作用。

m0_50546716的博客 125

g1的小结

g1比cms快的原因总结: 1.ygc的时候 g1有一个rset的结构,记录了哪个region引用我这个区域,这样ygc的时候就不需要扫描整个老年代(cms的时候其实也是扫描了老年代的card table),ygc时g1的扫描rset对比cms的扫描年老代的card table, g1胜 2.cms收集中remark重新标记阶段占据了80%的stw时间,原因是这个重新标识阶段cms要扫描所有的root 对象,包括所有新生代区域的对象都属于root对象,而g1有一个satb结构,在该阶段中,只需要扫描这个结构

lixia0417mul2的博客 821

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 685

G1-SATB、CMS-增量更新(文章记录)

https://blog.youkuaiyun.com/sai739295732/article/details/107358199 https://blog.youkuaiyun.com/RaymondCoder/article/details/106078984 https://blog.youkuaiyun.com/qq_36697880/article/details/105206385 1.incremental updated -- 是红色的线,新增引用 A->D,关注引用的增加把A会重新标记成为灰色,下次重新扫.

z69183787的专栏 2201

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JVM---理解G1的SATB和CMS的增量更新

关于G1,CMS,SATB,增量更新这些概念我就废话了,如果学习了JVM,我相信这些概念不是什么问题,这里我只说一下在学习过程中,糊涂了很长时间之后又通透了的地方。 参考文章《三色标记的漏标问题及两种解决方案》 相信大家都知道,CMS和G1在并发标记的时候才用了三色标记的方法,但是这种标记在并发的情况下会有漏标的问题。 CMS 先说CMS,CMS采用的是增量更新的方法,也就是说CMS只关心引用的增加,不关心引用的删除,我用图片举一个例子: CMS在进行并发标记的时候,n和a之间的引用断开了,但

qq_32019367的博客 3915

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

G1和CMS的三色标记法及漏标问题

首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记 -> (拷贝存活区域对象) 初始标记: 只会标记GCRoot直接关联的对象 并发标记: 基于初始标记时标记的对象作为起点, 标记所有(属性)关联的对象 最终标记: 处理漏标问题 (并发标记阶段, 漏标的GCRoot可达的对象) 什么是三色标记 标记复制算法中的标记阶段所用到的标记算法(三色标记算法); GC如果想查找到存活的对象,根据GCRoot可达分析算法 根据GCRoot引用链遍历存活对象。根据GCRoot..

祁_z 4328

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

GC 三色标记算法 SATB

什么是三色标记算法 1.jvm垃圾回收期使用的,在并行标记的时候的一种算法,CMS/G1中的核心算法。 2.把对象从逻辑上分为三种颜色,分别是黑色,灰色,白色 黑色:自身和成员变量均已标记 灰色:自身被标记,成员变量未被标记 白色:未被标记的对象 漏标 ![三色标记图](https://img-blog.csdnimg.cn/20200530131109992.png) 当进行并发标记的时候此时C是一个垃圾对象,是要被回收的,如果此时对象B指

叫兽张益达的博客 3092

为什么G1用SATB?CMS用增量更新?

三色标记内容点击下面链接 region(区域) SATB相对增量更新效率会高(当然SATB可能造成更多的浮动垃圾), 因为不需要在重新标记阶段再次深度扫描被删除引用对象, 而CMS对增量引用的根对象会做深度扫描, G1因为很多对象都位于不同的region, CMS就一块老年代区域,重新深度扫描对象的话G1的代价会比CMS高, 所以G1选择SATB不深度扫描对象,只是简单标记,等到下一轮GC再深度扫描。 ...

小丑竟是我自己 1751

JVM 三色标记 增量更新 原始快照

2.1 基本算法 要找出存活对象,根据可达性分析,从GC Roots开始进行遍历访问,可达的则为存活对象: 最终结果:A/D/E/F/G 可达 我们把遍历对象图过程中遇到的对象,按“是否访问过”这个条件标记成以下三种颜色: 白色:尚未访问过。 黑色:本对象已访问过,而且本对象 引用到 的其他对象 也全部访问过了。 灰色:本对象已访问过,但是本对象 引用到 的其他对象 尚未全部访问完。全部访问后,会转换为黑色。 三色标记遍历过程 假设现在有白、灰、黑三个集合(表示当前对象的颜色),其遍历

houjx3的博客 1990

原始快照(SATB)和增量更新(Incremental Update)

在垃圾回收(尤其是并发标记阶段)中,“漏标” 指的是并发标记过程中因应用线程修改对象引用,导致部分存活对象未被标记,最终被错误回收的问题。解决漏标的核心是跟踪并发标记期间的引用变化,确保所有存活对象都被正确标记。拦截引用修改操作,结合后续的补充标记阶段解决漏标问题,只是跟踪的侧重点不同,分别适应不同垃圾收集器的设计目标(如低延迟、高吞吐量)。SATB 是 G1、ZGC 等垃圾收集器采用的策略,核心思想是。,确保快照中的存活对象都被标记,即使后续引用发生变化。,确保新引用指向的对象被重新标记。

随便写写,Java/Python/Dart/TypeScript 1885

CMS与G1收集器

摘要:CMS和G1是JVM两大垃圾收集器,核心差异如下:CMS专管老年代,采用"标记-清除"算法,分4阶段(含并发标记/清除),通过卡表跟踪跨代引用,但会产生内存碎片;G1采用Region化设计,全域回收,基于"标记-整理+复制"混合算法,通过Remembered Set精确管理跨Region引用,支持可预测停顿(默认200ms)。CMS适合低延迟场景但需预留内存防CMF,G1则均衡吞吐与延迟,适合大堆应用。两者均通过写屏障处理并发标记,但机制不同(CMS用增量更新,

m0_73077921的博客 1569

05、垃圾回收器-CMS,G1

CMS和G1是新一代GC的代表,特别是CMS,虽然在生产环境中基本上不用CMS,但是它的并发和三色标记的一些设计思想是后面一些GC的理论基础。

qq_21451945的博客 872

G1 GC 源码级分析:从 Region 到 SATB,CMS 被取代的真正原因

本文深入解析G1垃圾收集器核心原理,适合有一定JVM调优经验的开发者。文章从实战问题切入,重点剖析了G1的三大核心机制:Region分块设计(堆内存离散化管理)、SATB标记算法(并发标记的准确性保障)和RememberedSet(跨Region引用跟踪)。通过OpenJDK源码分析,揭示了G1的暂停预测模型实现原理,并与CMS进行多维对比,说明G1在内存碎片处理上的优势。最后分享了调优经验,指出G1在16GB-64GB堆场景表现最佳,建议优先使用JDK17+的默认配置,通过GC日志针对性优化。文章强调理解

weixin_39042870的博客 560

Panda白话 - G1垃圾收集器 - 三色标记法、漏标、增量更新、SATB

三色标记法: GC HandBook把对象分成三种颜色: 黑色(Black) - 根对象,自身及可达对象都已经被标记 灰色 (Grey) - 自身已经被标记,可达对象还未被标记 白色 (White) - 还未被标记、垃圾对象 举个栗子吧: A.b = new B(); B.c = new C(); C.d = new D(); 如上图、有这么个引用关系: A对象有个field(成员变量)b,引用了B对象(存储B对象的物理地址),field c没有引用 B对象有个field(成员变量)c,引用了C

FightingITPanda的博客 1791

三色标记法与垃圾回收器(CMS、G1)

三色标记法是一种垃圾回收法,它可以让JVM不发生或仅短时间发生STW(Stop The World),从而达到清除JVM内存垃圾的目的。 三色标记法-算法思想 三色标记法将对象的颜色分为了黑、灰、白,三种颜色。 黑色:该对象已经被标记过了,且该对象下的属性也全部都被标记过了。(程序所需要的对象) 灰色:该对象已经被标记过了,但该对象下的属性没有全被标记完。(GC需要从此对象中去寻找垃圾) 白色:该对象没有被标记过。(对象垃圾) 算法流程: 从我们main方法的根对象(JVM中称为GC Root)开.

eddie's Blog 1237

CMS & G1 完整流程

本文对比分析了CMS和G1两种垃圾回收器的核心机制与工作流程。CMS采用标记-清除算法,使用增量更新写后屏障在并发标记阶段实时处理新引用,避免漏标,但会产生内存碎片。G1采用标记-复制算法,使用SATB写前屏障在并发标记阶段记录旧引用,但在最终标记阶段才统一处理SATB队列解决漏标问题。关键区别在于:CMS的增量更新是实时处理新引用,而G1的SATB是延迟处理旧引用。两者初始标记和最终/重新标记阶段都需要STW暂停,但G1通过Region划分实现了更可控的停顿时间。

weixin_68315058的博客 768
上一篇: Redis 过期策略
下一篇: 大文件上传的实现方式
programer_33
博客等级 码龄9年 49粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值