GC增量算法的理论与实践

详解GC(一)理论篇 一、理论篇 GC全称Garbage Collection,垃圾收集,是一种自动管理堆内存的机制,负责管理堆内存上对象的释放。在没有GC时,需要开发者手动管理内存,想要保证完全正确的管理内存需要开发者花费相当大的精力。所以为了让程序员把更多的精力集中在实际问题上,GC诞生了。 而GC世界里的对象,与我们常规理解的对象不同,它由头和域组成: 简单的理解,GC将原本对象使用的内存空间包装成了域,又添加了一块头的区域用来存储对象本身的信息和GC所需要的信息,不同的GC算法它使用的信息也不同。一般来说,头中 阅读详情
  author:tuiye@126.com
以 MMgc 为例
 
一 垃圾收集
       垃圾收集(Garbage Collection,GC)是一种自动打扫和清除内存垃圾的技术,它可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。计算机语言中,很多利用了这一技术来自动管理与之相关联的内存的清除,如Java,Perl,Python,Ruby,JavaScript等。但各自的机制不尽相同,例如Java是比较复杂的自适应GC技术,囊括Mark-Sweep,增量算法(Incremental Algorithm)等;Perl为引用计数(Count Reference);Python采用分代机制(Generation Algorithm);Ruby是标记清除(Mark-Sweep);JavaScript的不同引擎采用的迥异,Spider monkey是标记清除(Mark-Sweep),而Tamarin是又在此之上增加了增量算法。
 
         以上基本囊括了比较流行的GC算法,除此之外还有复制(Copying)算法与标记整理(Mark-Compact)算法等。这些算法各自有自身的优势,有的实现简单,有的回收及时(也可说内存峰值可以保持在较低水准),还有些可以用于实时系统(即每次收集不会占用很大CPU时间,造成停顿感),因此对于不同需求有应采用不同的方式。譬如一个需要 进行实时垃圾收集的运行环境采用增量收集是一个比较好的选择。
 
二 增量算法理论与三元色机制
         增量收集算法的基础仍是传统的标记清除和复制算法。增量收集算法通过对进程间冲突的妥善处理,允许垃圾收集进程以分阶段的方式完成标记、清理或复制工作。增量算法的具体机制可以用不同,但其思想都是把堆栈分为多个域,每次仅从一个域收集垃圾,从而造成较小的应用程序中断,其中比较著名的是火车(Train)机制与三色(三元色,Tri-Color)标记机制。以下介绍一下三元色机制的概念。
 
         在垃圾收集中,所有的对象可能出于其下的三种颜色中的一种:黑色,灰色与白色。各自代表:
         黑色(black):表示此节点已被访问到,且是live的(其子节点也被访问到),不会被回收(reclaimed);
         灰色(gray):表示此节点已在处理列表中,但其子节点尚未被检查;
         白色(white):表示此节点没有访问过,在GC完成后被视为垃圾对象;
 
         在标记之前先将堆中所有的分配单元置成白色,然后按深度优先算法遍历每一个单元。当垃圾收集器遍历一个分支的时候,如果一个分配单元及与之相关联的单元都被遍历到,则将其标记成黑色。如果一个单元被遍历到,但是与之相关联的单元尚未被遍历,则将该单元标记成灰色。这时,垃圾收集器将继续遍历与该灰色单元相关联的单元,直到这些相关联的单元全部被遍历到,才能将这个灰色单元标记成黑色。最后当所有被遍历到的单元都被标记成黑色的时候, 将堆中被标记成白色的分配单元回收。
 
         收集器处理过程中,去检测节点是否是能到达的(reachable),此活动中依靠找到从灰色节点到白色节点的边缘与把白色节点染色成灰色。因此每步跟踪包含选择一个灰色节点并且把其白色子节点标记成灰色。
[1] 灰色节点只有可能连接到另外的灰色的节点或黑色的节点,那么把它标记为黑色;
[2] 当没有灰色的节点剩下的时候,所有可到达的部分都已找到,余下的白色的节点都被回收。
         注意,黑色节点不可能有白色的子节点!也就是说黑色节点不能指向白的节点,这一点叫做不变量(invariant)。
 
为了保护与防止此种情况的发生,引入了读屏障(Read Barrier)与写屏障(Write Barrier)。
读屏障:当mutator存储一个从黑色转到白色的节点时引用,把其父或子节点置成灰色;(Detects an attempt to read a white object and immediately colors it gray)
x.f = y;     ->     black2gray(x).f = y;
写屏障:当mutator请求一个白色节点时,把它置成灰色;(Traps attempts to write a pointer into an object)
x.f = y;     ->     x.f = white2gray(y);
 
三 一个实现 MMgc
         在以上网址中,对Tamarin中实现的MMgc做了一个比较全面的阐述。当然在MMgc中不仅仅用了增量技术,但这里我们着重对增量技术做说明。
         [1] 所有在GC中的根 ( s )(roots)被压入队列(queue),此时所有根 ( s )为gray,而除此之外的都为white;
         [2] 在队列(queue)处理过程中,所有live objects有2种可能变化,从gray到black,从white到gray;
         [3] 当一个指向white对象的指针写入一个black对象的时候,此时不得不中断其写入行为,把white放入队列(queue),(注:这就是写屏障);当然此时还有另一种办法,就是把black对象放入队列,此种方式好处是当很多white对象写入同一个black对象是,我们只需要压入一次black对象,这样特别是当black对象是一个很大的数组的时候,对效率提高是比较有用的。另一方面,如果black对象的数组很大,而写入此对象的新的white对象很少,那么mark一个很大的black对象也是很低效的事件;
 
         所以引入一个比较流行的解决方案,叫做卡片标记( card marking ),不过 MMgc 未作实现( MMgc 作的是把 black 对象移到 gray ,即压入 queue ),其理论如下:(略, MMgc 未作实现)
 
         增量收集的时间片
         当前MMgc中,决定何时收集(collect)行为的是基于多少内存已被分配出来了,如果现在分配出来的内存占heap内存的一定比例以上的时候,MMgc会做收集(collection)。相似地,标记(mark)也可以基于以上的方式,当ISD(incremental start divisor)为4时候,那么只有heap的内存余下1/4的时候,就开始标记;当ISD为1的时候,意味着标记是经常要做的。
 
         决定时间片的因素有2个:
[1] the rate at which we can trace memory
[2] the rate at which the mutator is requesting more memory

四 参考文献
[1] GARBAGE.COLLECTION.Section6.pdf
[2] Wirth.ppt
[3] Incremental Tracing Collectors.pdf
[4] thesis-newgc.pdf
[5] garbagecollection.pdf
[6] orp.pdf
[7] Scheduling.Garbage.Collection.in.Embedded.System.pdf
[8] hirzel-dissertation.pdf
[9] color.pdf
[10] ASM.ppt
[11] 垃圾收集趣史
[12] 垃圾回收器基础与性能提示(card marking)
[13 ] Uniprocessor Garbage Collection Technique.ppt (tri-color)
[14] Incremental Mature Garbage Collection Using the Train Algorithm.htm (card marking)
 
增量式垃圾回收 简单的增量式垃圾回收通过这段时间对tinypy源码和编译原理这本书的研究,我终于敲开了增量式垃圾回收的“小门”;如果读者没有接触过基本的标记-清扫垃圾回收,最好先对其进行一定的了解。一、数据结构列表: 所有对象,标记为R, 未扫描对象,标记为U, 二、算法的理论基础 不可达对象永远不会变成可达对象。 树的遍历(增量标记的核心) 三、算法的执行过程初始化 初始化栈和对象的树; 将根对象push进U; 阅读详情

相关推荐

GC算法汇总

java的GC算法汇总GC算法引用计数法 Reference Counting根搜索算法 GC Roots Tracing标记-清除算法 Mark-Sweep复制算法 Copying标记整理算法 Mark-Compact标记-清除算法、复制算法、标记整理算法的总结:分代收集算法:(新生代的GC+老年代的GC)GC参数常见配置汇总 GC算法 引用计数法 Reference Counting 给对象添加一个引用计数器,每过一个引用计数器值就+1,少一个引用就-1。当它的引用变为0时,该对象就不能再被使用。它的实

qq_45029110的博客 309

计算机图形学复习2

直线生成算法和圆弧生成算法。

暖风吹起云之博客 3971

增量学习的基本原理解析

1.背景介绍 增量学习,也被称为在线学习,是一种机器学习方法,其主要特点是在训练过程中,随着新的数据的到来,模型不断更新,而不是一次性地使用所有数据来训练模型。这种方法在实际应用中具有很大的优势,因为它可以在数据流入的过程中立即得到模型的更新,从而实现快速的学习和适应。 增量学习的主要应用场景包括: 在数据

AI天才研究院 1468

增量学习的算法比较:选择最佳方案

1.背景介绍 随着数据量的不断增加,传统的机器学习方法已经无法满足实际需求。增量学习(Incremental Learning)是一种能够在新数据到来时自动更新模型的学习方法,它具有高效、实时性和适应性强的优势。在这篇文章中,我们将对比一些常见的增量学习算法,并分析它们的优缺点,以帮助读者选择最合适的方案。 2.核心概念与联系 增量学习是一种在新数据到来时更新模型的学习方法,它的核心概念包括...

AI天才研究院 876

unity-内存GC

unity 在 2018 的版本推出了所谓增量式GC的功能,还是基于 Boehm–Demers–Weiser garbage collector 的实现,但是不再是非分代式的,这能带来特别的技巧♂中第二点同样的好处,即均衡负载到多帧,消除毛刺。增量式GC目前还是抢先体验版本,因为它事实上还是存在一些问题,它的基本实现原理还是标记-清扫,但是在两次增量式GC之间,对象的引用可能会发生变化,导致前一次GC的标记失效,需要重新进行遍历标记,最糟的情况会退化为普通的非分代GC(其实更糟,因为前面的工作全白费了)。.

u013341672的博客 1612

PID算法-增量(详细)

关于调PID的详细指导,内容充实,良心推荐。

垃圾回收算法(6)-增量算法

前言 在垃圾回收过程中,应用软件处于一种Stop the World的状态。在Stop the World的状态下,应用程序的所有线程都会挂起,暂停一切工作,等待垃圾回收的完成。如果垃圾回收时间过长,应用程序会被挂起很久,将严重影响用户体验或者系统的稳定性。为了解决这个问题,即对实时垃圾手机算法的研究直接导致了增量收集算法的诞生。 多进程运行思路 最初,为了进行实时垃圾收集,可以设计一个多进程的运行环境,比如用一个进程执行垃圾收集工作,另一个进程执行程序代码。这样一来,垃圾收集工作看上去仿佛是在后台悄悄的干

少年闰土的博客 547

模式识别-固定增量算法

模式识别中的,固定增量算法。对两类问题进行判别

增量学习算法:实时学习与适应变化

1.背景介绍 在当今的大数据时代,数据量越来越大,不断地增长。传统的学习算法通常需要对所有的数据进行训练,这种方法在处理大规模数据时效率低下,且难以实时响应新数据的到来。因此,增量学习算法(Incremental Learning)成为了研究的热点。增量学习算法的核心思想是在学习过程中不断地更新模型,以适应新的数据和环境变化。 增量学习算法在各个领域都有广泛的应用,例如自然语言处理、图像识别、...

AI天才研究院 837

基于Openrouter的API调用免费大模型

Openrouter 是一个 AI 模型聚合平台,整合了全球 200 多种主流 AI 模型,包括 GPT-4、Claude、Gemini 等,以及国产通义千问、DeepSeek 等。其核心优势是统一的 API 设计,开发者仅需少量代码即可与多个模型交互,还支持自动路由与回退机制。用户可通过 OpenAI SDK 或 LangChain 调用 Openrouter 中的模型。

MurphyStar的博客 6199

3D模型文件格式全解析:从STL到glTF,10种主流格式与转换实战指南

在三维数字内容创作与工程制造领域,3D模型文件格式是数据交换与协作的基石。其核心原理在于以不同的数据结构(如三角网格、NURBS曲面、边界表示等)对三维物体的几何、外观及场景信息进行编码。理解这些格式的技术特性,对于保障数据完整性、提升工作流效率具有关键价值,广泛应用于3D打印、游戏开发、影视动画及工业设计等场景。例如,面向增材制造的STL格式以其极简的三角面片结构成为行业通用语,而支持丰富材质与动画的FBX格式则在影视游戏管线中扮演核心角色。本文聚焦于STL、OBJ、FBX、3MF、STEP等10种主流格

weixin_28520495的博客 353

(阅读笔记)垃圾回收的算法与实现 - 增量式GC

增量式 GC 是将 GC 和 mutator 一点一点交替运行的手法,而不是像停止型GC,需要等到 GC 执行完成。 停止型 GC 的最大暂停时间太长。 三色标记算法 增量式 GC 即 gc 与 mutator 间歇执行,那么 gc 就需要维护住『状态』让下一次运行时可以正常执行,为了达到这个效果,引入了下面几个结构 对象的 mark 标记 gc 阶段 一个 markStack,用来存储扫描中...

阿布的猫窝 714

如何在 Ubuntu 24.04 或 22.04 上安装和使用 GDebi

本文介绍了在Ubuntu 24.04上安装和使用GDebi的方法。GDebi是DPKG的轻量级替代品,能够自动解析并安装.deb包的依赖项。文章详细说明了系统更新、安装GDebi的步骤,并演示了通过GUI和CLI两种方式安装.deb包的操作流程。此外,还提供了验证安装和卸载包的方法。GDebi虽然非必需,但为用户提供了处理依赖项的另一种选择,适合需要安装本地Debian包的用户。

山岚的运维笔记 1970

GC算法及其原理

GC学习第一节 第一章 JVM之GC算法和GC收集器 文章目录GC学习第一节前言一、什么GC?二、GC算法有哪些?1. GC的依据2.垃圾回收核心概念2.1 基础概念2.2 三色标记法2.3 多标和漏标2.4 读屏障&写屏障3. 垃圾回收算法基础垃圾回收算法标记-清除算法(Mark-Sweep)标记-压缩算法(Mark-Compact)标记-复制算法(Mark-Copy)垃圾回收算法的改进分代算法(Generational GC)增量算法(Incremental GC)并发算法(Concurre

weixin_43179001的博客 1242

flink新版本无bat启动文件的解决办法

flink

6 4932

Transformer论文解读

Transformer有多牛逼不用多说,时隔7年我们再来看看论文原文,看看这篇深刻改变世界的文章都说了什么。当然逐字逐句解读已经意义不大,我们只列考点。

xian0710830114的专栏 4402

Unreal引擎GC优化:集群化与增量回收实战指南

垃圾回收(GC)是现代游戏引擎内存管理的核心技术,其核心原理是通过标记-清扫等算法自动回收不再使用的内存对象,避免内存泄漏。在实时渲染和交互应用中,传统GC的“Stop-The-World”特性会导致明显的性能卡顿,影响帧率稳定性。为了解决这一问题,高级GC优化技术应运而生,通过改变工作方式来提升运行时效率。其中,集群化(Clustering)通过将生命周期强相关的对象逻辑捆绑,减少GC遍历开销;增量回收(Incremental GC)则将标记阶段的工作拆分到多帧执行,平滑性能波动。这些技术对于构建大型开放

weixin_30876945的博客 343

从GitHub到海浪模拟:手把手教你配置WAVEWATCHⅢ 6.07.0的完整开发与测试环境

本文详细指导如何在Ubuntu系统中配置WAVEWATCHⅢ 6.07.0的开发与测试环境,涵盖虚拟机设置、依赖安装、源码编译及案例验证的全流程。通过步骤化教程,帮助科研人员快速搭建高效的海浪模拟平台,提升海洋数值模拟的研究效率。

weixin_42568801的博客 322

什么是垃圾回收(GC)?常见的垃圾回收算法有哪些?

垃圾回收(Garbage Collection,GC)是一种自动化内存管理机制,主要用于识别和回收程序中不再使用的内存空间,从而避免内存泄漏、提升内存利用率,并降低程序员手动管理内存的复杂度。其核心思想是将程序不再引用的内存块标记为“垃圾”,并自动释放这些资源以供后续重用。垃圾回收通过自动化内存管理显著提升了开发效率和程序稳定性,但需权衡性能开销与内存利用率。复制算法适合短生命周期对象,标记-整理解决老年代碎片问题,分代收集综合优化生命周期差异,而引用计数则提供低延迟回收但需处理循环引用。

破损的天堂鸟博客 1432

布尔可满足性问题(SAT)深度研究

布尔可满足性问题(Boolean Satisfiability Problem, SAT)是计算机科学和数理逻辑中的一个核心决策问题。其定义为:对于一个给定的布尔逻辑公式,判断是否存在一组对其变量的真值赋值(即,为每个变量指定真 (True) 或假 (False)),使得该公式的最终计算结果为真。如果存在这样的赋值,则称该布尔公式是可满足的 (satisfiable);否则,称其为不可满足的 (unsatisfiable)。

步子哥的博客 493

【DexGraspNet与多指手抓取算法详解】第三章 DexGraspNet数据集构建机理

抓取姿态描述多指手与物体的相对空间关系,包含手掌位姿与手指关节配置。

VectorShift的博客 497

GO语言中的垃圾回收(GC)

Go语言GC机制从1.3到1.18版本经历了显著优化。早期版本(1.3前)采用标记-清除算法,需全局STW暂停;1.3-1.5引入并发清除;1.5-1.7实现并发标记+Dijkstra写屏障,STW降至10ms;1.8采用混合写屏障,STW缩短到亚毫秒级;1.18+引入增量GC和Pacer机制,动态调整GC触发时机。GC流程包括:触发准备、初始STW(标记根对象)、并发标记(增量执行)、最终STW(确认标记)、并发清除和恢复阶段。通过版本迭代,Go实现了从秒级到毫秒级的STW优化,显著提升了性能表现。

2301_76723322的博客 1261

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Java】jvm 垃圾回收 算法 理论

概述 最近在研究gc相关的内容,这里整理下。 先从算法部分开始。为什么从算法开始,因为看过一点gc方面的内容都知道最基础的三个算法:标记整理,复制,标记清理,我看过后一直有一个疑问,年轻代使用的是复制算法,但是都知道复制算法的空间利用率不高,为什么不直接使用标记整理算法???大致想想,二者都需要移动活着的对象,但是标记-整理空间利用率高,为什么不直接用???看了许多博客,其中一些指出了原因:标记...

u010900754的专栏 803

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

假人有限元模型

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

GC机制原理以及C#、Unity、UE中的相关应用的总结

GC,垃圾回收机制,通过识别堆上动态开辟的内存的使用情况,确定那些内存区域需要被回收。 中间涉及到的问题主要有: 内存标记 内存碎片 内存压缩 指针修复 内存泄漏 反复释放 GC算法 标记清除法(mark-swap) 优点: 不需要移动对象,适用于存活对象较多的情况 缺点 标记和清除清除过程效率不高 产生内存碎片 标记整理法 优点 消除内存碎片 缺点 GC耗时增加,需要复制到内存到新地址 需要修复指针 拷贝算法(copying collecter) 原理: 将内存分成

mmy545237835的博客 5026

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

GC垃圾收集算法详解

一、垃圾标记算法 1、对象存活判断 只有对堆内存上对象进行标记出哪些是存活的,哪些是死亡(不再被其他存活对象引用)对象。被标记为死亡的对象在GC时被回收。 判断对象存活主要有两种方式 (1)引用计数(java未选择,python选择) 每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。 算法思想: 对于一个对象A,只要有任何对象引用了A,则A的引用计数加1,当引用失效,此时引用计数器减1。一旦引用计数器值为0,则可以被回收。 优点: 实现简单,垃圾对象便于辨识,判定效率高,回

勇心在馨 387

仓颉GC调优参数深度解析:从理论到实战的完整指南

通过系统化的GC调优,我们将IoT服务的99分位延迟从150ms优化到8ms,同时吞吐量提升了40%。这个过程展示了仓颉GC系统的强大能力和调优空间。GC调优是一门艺术,需要深入理解GC算法、应用特征和硬件架构。仓颉提供的丰富参数和监控能力,为开发者提供了强大的优化工具。随着仓颉生态的发展,期待未来能看到更智能的自适应GC和可视化调优工具,进一步降低性能优化的门槛。记住,最好的GC是不需要GC的对象。在追求GC参数最优的同时,不要忘记从代码设计上减少不必要的内存分配,这才是性能优化的根本之道!

2504_94022861的博客 1602
上一篇: 消递归(recursion)的一种方式
下一篇: Auto Test User Guide
Findback
博客等级 码龄20年 35粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值