标记-清除算法

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垃圾回收器中使用的回收算法)相关推荐

  1. 【JVM】三色标记法

    原因 在CMS等并发收集器,并发标记的过程中需要对对象进行标记,用于区别对象.防止多标,漏标等情况. 三色标记 三色标记法就是指将GC roots可达性算法分析遍历对象过程中将各个对象,按照" ...

  2. JVM垃圾回收——三色标记法

    目录 一.什么是三色标记 二.三色标记的过程 三.三色标记的缺点 四.垃圾回收机如何弥补三色标记的缺点 在CMS.G1这种并发的垃圾收集器收集对象时,假如一个对象A被GC线程标记为不可达对象,但是用户 ...

  3. golang 垃圾回收、三色标记法、写屏障

    垃圾回收简称 GC,就是对程序中不再使用的内存资源进行自动回收释放的操作. 常见的垃圾回收算法 引用计数:每个对象维护一个 引用计数,当对象被创建或被其他对象引用时,计数 +1:如果引用该对象的对象被 ...

  4. 浅谈垃圾对象回收之《三色标记法》

    文章目录 前言 什么是垃圾回收 JAVA的垃圾回收回顾 GO的垃圾回收学习 **三色标记法(tricolor mark-and-sweep algorithm)** Dijkstra方法(插入屏障,强 ...

  5. 【JVM】三色标记法与读写屏障

    1.概述 首先:CMS和G1都使用了三色标记法 关于垃圾回收算法,基本就是那么几种:标记-清除.标记-复制.标记-整理.在此基础上可以增加分代(新生代/老年代),每代采取不同的回收算法,以提高整体的分 ...

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

    首先标记有三个阶段: 初始标记 -> 并发标记 -> 最终标记  ->  (拷贝存活区域对象) 初始标记: 只会标记GCRoot直接关联的对象 并发标记: 基于初始标记时标记的对象作 ...

  7. 详细图解JVM三色标记法

    文章目录 为什么要使用三色标记法? 三色标记法中的三色 三色标记的漏标问题 如何解决漏标问题? CMS 增量更新(Incremental Update) G1 原始快照(Snapshot At The ...

  8. 从普通回溯到三色标记法法

    文章目录 题目 题目解析 题目解析 普通dfs回溯(超时) 三色标记法优化dfs 题目 题目解析 题目解析 读完题目我们需要知道的是,这题就是需要我们判断以某个点为起点的所有路径不能含有环,我们只需要 ...

  9. python解析原理_Python语法垃圾回收机制原理解析

    一 引入 解释器在执行到定义变量的语法时,会申请内存空间来存放变量的值,而内存的容量是有限的,这就涉及到变量值所占用内存空间的回收问题,当一个变量值没有用了(简称垃圾)就应该将其占用的内存给回收掉,那 ...

最新文章

  1. python自定义类如何定义向量的模_gensim的word2vec如何得出词向量(python)
  2. python125免费教程,125 个视频成就千万级网红,Python 告诉你李子柒都在拍些什么?...
  3. Tomcat 服务器server.xml,web.xml的关键参数配置
  4. 超级简单:一步一步教你创建一小型的asp.net mvc 应用程序
  5. python中不属于整数类型_哪个选项不是Python语言的整数类型?
  6. c语言1A,C程序设计语言1a.ppt
  7. 给定入栈序列,判断出栈序列是否合法
  8. css之使用clearfix类清除浮动
  9. win10 计算机 权限,介绍电脑windows10管理员权限开启的4种方法
  10. Win10纯净版和官方原版哪个好?
  11. web界面设计要素及基本设计规范
  12. 爬虫项目报错Traceback (most recent call last): File D:/studay/python/one/day01/07_post请求.py, line 38,
  13. ipa文件上传到iTunes Connect
  14. 如何将excel三列数据合为一列日期数据
  15. 时间颗粒度相关数据处理
  16. 什么是传递函数模型?
  17. colorkey唇釉是否安全_所谓的colorkey真假对比
  18. 《缠中说禅108课》85:逗庄家玩的一些杂史 3
  19. 编译错误:errno undeclared的解决
  20. luoguP4707 重返现世

热门文章

  1. 简易的自动抢购脚本,适用于各种限购产品,你懂得!
  2. GP2Y1010AU0F 粉尘传感器
  3. Java 八大核心包介绍
  4. 电子积木fx微型计算机,电子积木在电子电工理论教学中的实践应用
  5. 到底是原画好还是做3d游戏建模好?
  6. android 购物车 简书,Android仿饿了么购物车效果
  7. 结构体与共用体字节数计算
  8. MFC中LoadLibrary调用Qt动态库失败的原因
  9. java计算机毕业设计vue宿舍管理系统MyBatis+系统+LW文档+源码+调试部署
  10. css实现input搜索框展开动画