双/三色标记法的垃圾回收(GC)原理解析和缺陷解决方案(Go,Lua以及jvm的CMS和G1垃圾回收器中使用的回收算法)
标记-清除算法
go和lua虚拟机以及jvm的CMS和G1垃圾回收器的回收算法的思想均来自于标记-清除算法(Mark-Sweep),它们的gc有重要的两部分:
1.从根节点遍历所有对象,如果可达到,则标记
2.遍历所有对象,如果没有标记,则destory对象
双色标记法
在lua5.1之前,lua采用的是二色标记法,
第一遍扫描对象,并标记扫描到的对象为黑色,第二遍时候将白色对象destory掉
这个过程没法中断,如果在gc的时候创建完新的对象,那么在最后destory清算的时候,这个白色对象显然是没法判断是无法到达的还是新创建出来的
于是为了防止创建的新的白色对象对gc过程产生干扰,干脆就让程序停下来,就不会产生干扰了,但是代价是程序停顿,影响主线程,显然这种方式和不适用了
于是后面有了更先进的三色标记法
三色标记法
在lua5.1之后和go语言以及jvm的CMS和G1垃圾回收器使用的是三色标记法
下面给出它的简易回收原理
三色:
白色:对象没有被垃圾回收器访问时候标记为白色
灰色:这个对象正处在被扫描,但是它所有引用都没访问完的时候被标记为灰色
黑色:当一个对象的所有引用都被扫描了以后的时候,这个对象被标记为黑色
标记过程:
1.从根集开始遍历
2.遍历到的白色对象push入栈并标黑,遍历到灰色和黑色对象则跳过
3.从栈中pop出一个灰色对象,标记为黑色,并将这个节点执行步骤2
4.栈空的时候,将白色对象都destory
实例解析:
当开始的时候,根节点为黑色,可见,B和D对象是不可达到的位置
从根节点遍历,遍历到C,将C标记为灰色,开始遍历C
遍历到E,将其变为灰色,开始遍历E,但是没有可遍历对象,就将其变为黑色
同理也将F变为黑色
C的所有节点遍历完成,将C变为黑色
当没有灰色对象的时候(当灰色对象栈清空的时候),将白色对象destory
当这样就完成了gc
注意到和双色标记法不同的是,这次判断条件是当灰色对象没有的时候进行gc,那时候的白色对象就一定是可以安全回收的对象了
三色标记法的隐患
在扫描B的节点的时候,B节点变为灰色,当扫描B的其他节点时候
C在这时候引用变为A,那么B扫不上C,自己变黑,但是A已经不会再次扫描,C就被误当为“不可达节点”给destory掉,显然是不对的
这个问题的核心点有两个
1.灰色和白色断开
2.黑色和白色建立引用
为了解决上面的问题,在java的G1回收器和CMS垃圾回收器中分别从1和2两个方面入手给了两种解决方案:
G1的方法叫做原始快照(SATB)算法
原始快照是将灰色对象断开到白色对象的引用关系记录下来,扫描结束后根据记录以记录的灰色对象为根重新扫描一次
CMS的增量更新(Incremental Update)算法
增量更新是将黑色和白色建立引用的过程记录下来,根据这些记录以被记录的黑色对象为根重新扫描一次,用的是写屏障技术(write barrier)
双/三色标记法的垃圾回收(GC)原理解析和缺陷解决方案(Go,Lua以及jvm的CMS和G1垃圾回收器中使用的回收算法)相关推荐
- 【JVM】三色标记法
原因 在CMS等并发收集器,并发标记的过程中需要对对象进行标记,用于区别对象.防止多标,漏标等情况. 三色标记 三色标记法就是指将GC roots可达性算法分析遍历对象过程中将各个对象,按照" ...
- JVM垃圾回收——三色标记法
目录 一.什么是三色标记 二.三色标记的过程 三.三色标记的缺点 四.垃圾回收机如何弥补三色标记的缺点 在CMS.G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户 ...
- golang 垃圾回收、三色标记法、写屏障
垃圾回收简称 GC,就是对程序中不再使用的内存资源进行自动回收释放的操作. 常见的垃圾回收算法 引用计数:每个对象维护一个 引用计数,当对象被创建或被其他对象引用时,计数 +1:如果引用该对象的对象被 ...
- 浅谈垃圾对象回收之《三色标记法》
文章目录 前言 什么是垃圾回收 JAVA的垃圾回收回顾 GO的垃圾回收学习 **三色标记法(tricolor mark-and-sweep algorithm)** Dijkstra方法(插入屏障,强 ...
- 【JVM】三色标记法与读写屏障
1.概述 首先:CMS和G1都使用了三色标记法 关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分 ...
- G1和CMS的三色标记法及漏标问题
首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记 -> (拷贝存活区域对象) 初始标记: 只会标记GCRoot直接关联的对象 并发标记: 基于初始标记时标记的对象作 ...
- 详细图解JVM三色标记法
文章目录 为什么要使用三色标记法? 三色标记法中的三色 三色标记的漏标问题 如何解决漏标问题? CMS 增量更新(Incremental Update) G1 原始快照(Snapshot At The ...
- 从普通回溯到三色标记法法
文章目录 题目 题目解析 题目解析 普通dfs回溯(超时) 三色标记法优化dfs 题目 题目解析 题目解析 读完题目我们需要知道的是,这题就是需要我们判断以某个点为起点的所有路径不能含有环,我们只需要 ...
- python解析原理_Python语法垃圾回收机制原理解析
一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...
最新文章
- python自定义类如何定义向量的模_gensim的word2vec如何得出词向量(python)
- python125免费教程,125 个视频成就千万级网红,Python 告诉你李子柒都在拍些什么?...
- Tomcat 服务器server.xml,web.xml的关键参数配置
- 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序
- python中不属于整数类型_哪个选项不是Python语言的整数类型?
- c语言1A,C程序设计语言1a.ppt
- 给定入栈序列,判断出栈序列是否合法
- css之使用clearfix类清除浮动
- win10 计算机 权限,介绍电脑windows10管理员权限开启的4种方法
- Win10纯净版和官方原版哪个好?
- web界面设计要素及基本设计规范
- 爬虫项目报错Traceback (most recent call last): File D:/studay/python/one/day01/07_post请求.py, line 38,
- ipa文件上传到iTunes Connect
- 如何将excel三列数据合为一列日期数据
- 时间颗粒度相关数据处理
- 什么是传递函数模型?
- colorkey唇釉是否安全_所谓的colorkey真假对比
- 《缠中说禅108课》85:逗庄家玩的一些杂史 3
- 编译错误:errno undeclared的解决
- luoguP4707 重返现世