【七天入门Go语言】 GC垃圾回收三色标记 | 第七天
目录
- GC
- 三色标记法
- 最后
GC
GC
全称Garbage Collection
目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法
(Tracing garbage collection)和引用计数法
( Reference counting )。
而三色标记法
是属于追踪式垃圾回收算法
的一种。
追踪式算法的核心思想是判断一个对象是否
可达
,因为一旦这个对象不可达就可以立刻被 GC 回收了。
那么如何判断一个对象是否可达呢?
分为两步:
- 第一步找出所有的全局变量和当前函数栈里的变量,标记为可达。
- 第二步,从已经标记的数据开始,进一步标记它们可访问的变量,周而复始,这一过程也叫
传递闭包
。
在go推出三色标记法之前,go所使用的gc算法叫Mark-And-Sweep
(标记清扫)
这个算法就是严格按照追踪式算法的思路来实现的。
- 先设置一个标志位来记录对象是否被使用,最开始所有的标记位都是 0。
- 如果发现对象是可达的就会置为
1
,一步步下去就会呈现一个类似树状的结果。 - 等标记的步骤完成后,会将没有被标记的对象统一清理,再次把所有的标记位设置成 0, 以便下次进行清理。
这个算法最大的问题是 GC
执行期间需要把整个程序完全暂停
,不能异步进行GC
操作。因为在不同阶段标记清扫法的标志位 0 和 1 有不同的含义,那么新增的对象无论标记为什么都有可能意外删除这个对象。对实时性要求高的系统来说,这种需要长时间挂起的标记清扫法是不可接受的。所以就需要一个算法来解决 GC 运行时程序长时间挂起的问题,那就三色标记法。
三色标记法
三色标记法是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法。on-the-fly
原理如下
- 整个进程空间里申请每个对象占据的内存可以视为一个图, 初始状态下每个内存对象都是白色标记。
- 先
stop the world
,将扫描任务作为多个并发的goroutine立即入队给调度器,进而被CPU处理,第一轮先扫描所有可达的内存对象,标记为灰色放入队列 - 第二轮可以恢复start the world,将第一步队列中的对象引用的对象置为灰色加入队列,一个对象引用的所有对象都置灰并加入队列后,这个对象才能置为黑色并从队列之中取出。循环往复,最后队列为空时,整个图剩下的白色内存空间即不可到达的对象,即没有被引用的对象;
- 第三轮再次
stop the world
,将第二轮过程中新增对象申请的内存进行标记(灰色),这里使用了writebarrier
(写屏障)去记录这些内存的身份;
这个算法可以实现 on-the-fly
,也就是在程序执行的同时进行收集,并不需要暂停整个程序。
简化步骤如下:
1、首先创建三个集合:白、灰、黑。
2、将所有对象放入白色集合中。
3、然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色
集合放入灰色
集合。
因为root set 指向了A、F,所以从根结点开始遍历的是A、F
,所以是把A、F放到灰色集合中。
4、之后遍历灰色集合,将灰色对象引用的对象
从白色集合
放入灰色集合
,之后将此灰色对象放入黑色集合
我们可以发现这个A指向了B,C,D所以也就是把BCD放到灰色中,把A放到黑色中,而F没有指任何的对象,所以直接放到黑色中。
5、重复 4 直到灰色中无任何对象
因为D指向了A所以D也放到了黑色中,而B和C能放到黑色集合中的道理和F一样,已经没有了可指向的对象了。
6、通过write-barrier
检测对象有无变化,重复以上操作
由于这个EGH并没有和RootSet有直接或是间接的关系,所以就会被清除。
7、收集所有白色对象(垃圾)
所以我们可以看出这里的情况,只要是和root set根集合直接相关
的对象或是间接相关
的对象都不会被清楚。只有不相关的才会被回收。
参考文档:
一张图讲解GC
关于write-barrier写屏障
最后
小生凡一,期待你的关注。
【七天入门Go语言】 GC垃圾回收三色标记 | 第七天相关推荐
- 内存管理篇(三):Go垃圾回收之三色标记算法
三色标记法介绍: 三色标记法(tricolor mark-and-sweep algorithm)是传统 Mark-Sweep 的一个改进,它是一个并发的 GC 算法,在Golang中被用作垃圾回收的 ...
- JVM 调优 2:GC 如何判断对象是否为垃圾,三色标记算法应用原理及存在的问题?
文章目录 前言 一.如何判断一个对象是否为垃圾? 1.1.reference count(引用计数) 1.2.reference count(引用计数)存在的问题 二.Root Searching(根 ...
- JVM垃圾回收——三色标记法
目录 一.什么是三色标记 二.三色标记的过程 三.三色标记的缺点 四.垃圾回收机如何弥补三色标记的缺点 在CMS.G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户 ...
- python垃圾回收机制gcgo_GO GC 垃圾回收机制
垃圾回收(Garbage Collection,简称GC)是编程语言中提供的内存管理功能. 在传统的系统级编程语言(主要指C/C++)中,程序员定义了一个变量,就是在内存中开辟了一段相应的空间来存值. ...
- gc:C语言的垃圾回收库-中文
Table of Contents gc:标记并清除C的垃圾回收 致谢 文档概述 快速开始 下载,编译和测试 基本用法 核心API 启动,停止,暂停,恢复和运行GC 内存分配和释放 辅助功能 基本概念 ...
- gc:C语言的垃圾回收库-英文
<gc:C语言的垃圾回收库-中文> GitHub:gc:C语言的垃圾回收库 gc: mark & sweep garbage collection for C gc is an i ...
- golang GC垃圾回收机制
** golang GC垃圾回收 ** 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Go ...
- java golang gc_Golang GC 垃圾回收机制详解
摘要 在实际使用 go 语言的过程中,碰到了一些看似奇怪的内存占用现象,于是决定对go语言的垃圾回收模型进行一些研究.本文对研究的结果进行一下总结. 什么是垃圾回收? 曾几何时,内存管理是程序员开发应 ...
- java垃圾回收机制_乐字节Java|GC垃圾回收机制、package和import语句
本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...
最新文章
- 领航商务之选——金立M5 plus体验札记
- vue笔记(四)注册组件,路由,vuex
- 图像编码中的小白问题sps ,pps ,nalu ,frame ,silce ect....
- 速更新!流行的开源邮件客户端 Mozilla Thunderbird 91.3修复多个高危缺陷
- adb小天才_ADB工具包2020年最新版下载-支持解锁新机BL调试ROOT等各种操作
- 2022年计算机二级C语言程序设计复习题及答案
- google测试框架
- kafka-Streaming错误:在IDEA连接kafka时出现错误
- 期货市场监控后台管理系统
- python_pdf常规使用
- 【深度学习】ONNX 模型文件修改节点的名称,修改输入名称,修改输出名称
- 用水流的概念来玩硬件(三)----LDO与DCDC电源电路
- uc收藏导入html,win10系统下UC浏览器如何导入其他浏览器的收藏夹
- 嵌入式linux华清远见考试,嵌入式Linux小测及答案
- 虚无主义还是怀疑论? 1
- burpsuite靶场系列之高级漏洞篇 - HTTP请求走私专题
- java.sql.Date和java.sql.Timestamp转换
- 高德大数据获取系统应用说明
- 操作系统的内存管理你知道吗
- Echarts legend翻页滚动形式
热门文章
- 华为服务器扩容内存进不去系统,服务器内存扩容难点
- 系列 | 数仓实践第三篇NO.3『拉链表』
- Unity相机跟随以及子弹发射笔记
- 博图v15找不到许可证step7_添加PLC时出现“找不到许可证step7 basic”-工业支持中心-西门子中国...
- 第世界上第一代电子计算机,第一代电子计算机
- MySQL数据打标_易打标(标签条码打印软件)
- 登陆模块之JWT单点登录
- 浮华的世态,只会将一颗心,涂染得色彩缤纷,失去往日纯净的姿态
- 冲击红队第一天 - Web安全介绍与基础入门
- Java中的IO流与Properties