概述

增量式垃圾回收也并不是一个新的回收算法, 而是结合之前算法的一种新的思路.

之前说的各种垃圾回收, 都需要暂停程序, 执行GC, 这就导致在GC执行期间, 程序得不到执行. 因此出现了增量式垃圾回收, 它并不会等GC执行完, 才将控制权交回程序, 而是一步一步执行, 跑一点, 再跑一点, 逐步完成垃圾回收, 在程序运行中穿插进行. 极大地降低了GC的最大暂停时间.

实现

增量式垃圾回收只是提出了这样的一个概念, 并没有限定如何去实现. 想必也有不同的实现思路吧.

三色标记算法

此算法将对象做不同的标记

  • 白色: 未搜索过的对象
  • 灰色: 正在搜索的对象
  • 黑色: 搜索完的对象

这里的颜色只是一种虚构的概念, 就是在对象上打tag.

在GC开始执行时, 所有对象都是白色的, 然后将根集合的对象放到栈中, 并标记为灰色, 依次处理. 将对象从栈中取出, 递归搜索所有子对象, 并标记为灰色, 当子对象搜索完后, 就将对象标记为黑色. 这样, 当一个对象搜索完后, 该对象及其关联的所有子对象就都是黑色的了. 当标记阶段结束后, 所有活动对象都是黑色, 垃圾对象则是白色.

此算法就是通过这样, 逐步对对象进行标记.

三色标记应用于标记清除中

标记清除算法在标记阶段, 应用三色标记逐步标记, 每次搜索一定次数后, 就返回执行, 等待下次继续标记, 将标记分为小段穿插在程序中运行.

在清除阶段, 也可以设置一个次数, 每遍历一定数量的对象, 就返回等待下次继续.

三色标记不光可以应用于标记清除中, 也可以应用于其他标记算法中.

问题

你以为这就完了么? 天真, 想象一下这样的场景:

// 假设 c, d 是两个对象
$b->son = $d;
$b->son = $c;
// 在这个时候, 开始GC, 将d标记为白色, 将c标记为黑色. 返回
$b->son = $d;
// GC清除阶段, 将c对象保留, 将d对象回收

这样就出现问题了, 也就是说如果我已经对其进行过标记了, 但它在我标记之后进行了修改, 就会导致清除阶段的对象很可能不是当时的真实情况.

那么如何防止这种遗漏的标记呢? 简单粗暴一点, 每次更新指针的时候, 如果对象是白色的, 就将其涂成灰色, 放到待搜索的栈中, 之后重新对其进行标记. 这样就可以保证不会回收到引用的对象, 虽然可能会有一些遗漏对象没有回收, 但是 who care? 下一次再回收咯.

也有不同的写入屏障处理方法, 在更新对象时进行不同操作.

大概如此…

GC算法-增量式垃圾回收相关推荐

  1. GC算法-分代垃圾回收

    概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. ...

  2. 趣谈GC技术,解密垃圾回收的玄学理

    趣谈GC技术,解密垃圾回收的玄学理论 GC的由来 一个例子引发的问题 GC的意义 GC算法 Reference Counting 循环引用 破环之道 作者介绍 开源项目介绍 大多数程序员在日常开发中常 ...

  3. javascript 垃圾回收机制--分代式垃圾回收机制

    以前对 javascript 的垃圾回收机制没有深入了解过.以为只是简单的标记清除法.即从根对象开始找它的引用,然后依次往后找它引用的引用,依次递归,将所有被引用的变量打上标记.然后在遍历完后,清除没 ...

  4. GC.Collect如何影响垃圾回收

    根据垃圾回收的算法,对象在内存中是按代的方式存放的,通常情况下,当第0代沾满分配的空间的时候(比如是256k),GC就会启动去回收第0代对象,幸存的第0代对象会被放入第1代中去,第1代的对象要等到放满 ...

  5. 并发增量复制垃圾回收 (Concurrent and Incremental Copying GC) 和虚拟内存应用

    本文是对 6.S081 课程中 VM applications 论文阅读中对虚拟内存能应用于 Garbage Collection 的笔记.主要记录垃圾回收的一些算法和解释论文的应用点.内容是从最简单 ...

  6. 趣谈GC技术,解密垃圾回收的玄学理论(一)

    点击上方蓝字,关注我们~ 导语:大多数程序员在日常开发中常常会碰到GC的问题:OOM异常.GC停顿等,这些异常直接导致糟糕的用户体验,如果不能得到及时处理,还会严重影响应用程序的性能.本系列从GC的基 ...

  7. java_opts gc回收器_JVM之垃圾回收机制(GC)

    JVM之垃圾回收机制全解(GC)文章底部有思维导图,较为清晰,可参考 导读:垃圾回收是Java体系中最重要的组成部分之一,其提供了一套全自动的内存管理方案,要想掌握这套管理方案,就必须了解垃圾回收器的 ...

  8. 对比Ruby和Python的垃圾回收(2):代式垃圾回收机制

    本文由 伯乐在线 - 熊崽Kevin 翻译自 patshaughnessy.欢迎加入 技术翻译小组.转载请参见文章末尾处的要求. 对比Ruby和Python的垃圾回收(1) 上周,我根据之前在RuPy ...

  9. golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术

    作者:镜萱 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用 ...

最新文章

  1. android 小知识点
  2. 第三章 python webdriver API(一)——浏览器操作
  3. 使用datatables 中文排序
  4. python注册登录+mysql_Flask+MySql实现用户登录注册
  5. 8月8日云栖精选夜读:他的前半生是厨神,45岁却决定加入阿里巴巴
  6. JSon数据操作示列
  7. amCharts: JavaScript/HTML5 charts 破解
  8. 分布式密钥管理Nucypher
  9. java线程栈日志_Java线程堆栈
  10. java remove removeat_Java PriorityQueue删除任意元素的性能
  11. JAVA微信开发-新手接入指南
  12. 金蝶实习(十一)——简单的二次开发
  13. VRCHAT——SDK3
  14. 编译原理大作业-PL0语言编译器
  15. 我的 Chrome 插件集
  16. GS1011无线模块的使用简介。
  17. 电机功率和转矩、转速之间的关系
  18. uCOS3源码解析视频教程-第4季第7部分-朱有鹏-专题视频课程
  19. 简单的MySQL银行转账实例
  20. UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图

热门文章

  1. 改进初学者的PID-采样时间
  2. 在Amazon FreeRTOS V10中使用运行时统计信息
  3. JAVA入门级教学之(while循环语句)
  4. JAVA入门级教学之(编写第一个HelloWorld程序)
  5. c语言putchar_C语言实现变色的心!连机器都会变心,呵,男人!
  6. 画股票图csdn_这个股票今天是要弄啥?
  7. pythongui显示图片_opencv2.4.13+python2.7学习笔记--opencv中的Gui特性--图片:读图像,显示图像,保存图像...
  8. java mongodb gridfs_查询MongoDB GridFS元数据(Java)
  9. 2012服务器系统安装iis,Windows Server 2012服务器管理系统安装配置IIS8.5教程
  10. python22起作业答案_python第22天作业