GC算法-增量式垃圾回收
概述
增量式垃圾回收
也并不是一个新的回收算法, 而是结合之前算法的一种新的思路.
之前说的各种垃圾回收, 都需要暂停程序, 执行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算法-增量式垃圾回收相关推荐
- GC算法-分代垃圾回收
概述 分代垃圾回收并不是一个新的算法, 而是将之前的回收算法结合利用, 分场景使用. 简单来说, 分代垃圾回收的思路, 就是给每个对象都分配一个年龄, 年龄越大的, 活的越久, 被回收的概率就越小. ...
- 趣谈GC技术,解密垃圾回收的玄学理
趣谈GC技术,解密垃圾回收的玄学理论 GC的由来 一个例子引发的问题 GC的意义 GC算法 Reference Counting 循环引用 破环之道 作者介绍 开源项目介绍 大多数程序员在日常开发中常 ...
- javascript 垃圾回收机制--分代式垃圾回收机制
以前对 javascript 的垃圾回收机制没有深入了解过.以为只是简单的标记清除法.即从根对象开始找它的引用,然后依次往后找它引用的引用,依次递归,将所有被引用的变量打上标记.然后在遍历完后,清除没 ...
- GC.Collect如何影响垃圾回收
根据垃圾回收的算法,对象在内存中是按代的方式存放的,通常情况下,当第0代沾满分配的空间的时候(比如是256k),GC就会启动去回收第0代对象,幸存的第0代对象会被放入第1代中去,第1代的对象要等到放满 ...
- 并发增量复制垃圾回收 (Concurrent and Incremental Copying GC) 和虚拟内存应用
本文是对 6.S081 课程中 VM applications 论文阅读中对虚拟内存能应用于 Garbage Collection 的笔记.主要记录垃圾回收的一些算法和解释论文的应用点.内容是从最简单 ...
- 趣谈GC技术,解密垃圾回收的玄学理论(一)
点击上方蓝字,关注我们~ 导语:大多数程序员在日常开发中常常会碰到GC的问题:OOM异常.GC停顿等,这些异常直接导致糟糕的用户体验,如果不能得到及时处理,还会严重影响应用程序的性能.本系列从GC的基 ...
- java_opts gc回收器_JVM之垃圾回收机制(GC)
JVM之垃圾回收机制全解(GC)文章底部有思维导图,较为清晰,可参考 导读:垃圾回收是Java体系中最重要的组成部分之一,其提供了一套全自动的内存管理方案,要想掌握这套管理方案,就必须了解垃圾回收器的 ...
- 对比Ruby和Python的垃圾回收(2):代式垃圾回收机制
本文由 伯乐在线 - 熊崽Kevin 翻译自 patshaughnessy.欢迎加入 技术翻译小组.转载请参见文章末尾处的要求. 对比Ruby和Python的垃圾回收(1) 上周,我根据之前在RuPy ...
- golang 关闭gc 并手动gc_Golang垃圾回收 屏障技术
作者:镜萱 垃圾回收(Garbage Collection,简称GC)是编程语言中提供的自动的内存管理机制,自动释放不需要的对象,让出存储器资源,无需程序员手动执行. Golang中的垃圾回收主要应用 ...
最新文章
- android 小知识点
- 第三章 python webdriver API(一)——浏览器操作
- 使用datatables 中文排序
- python注册登录+mysql_Flask+MySql实现用户登录注册
- 8月8日云栖精选夜读:他的前半生是厨神,45岁却决定加入阿里巴巴
- JSon数据操作示列
- amCharts: JavaScript/HTML5 charts 破解
- 分布式密钥管理Nucypher
- java线程栈日志_Java线程堆栈
- java remove removeat_Java PriorityQueue删除任意元素的性能
- JAVA微信开发-新手接入指南
- 金蝶实习(十一)——简单的二次开发
- VRCHAT——SDK3
- 编译原理大作业-PL0语言编译器
- 我的 Chrome 插件集
- GS1011无线模块的使用简介。
- 电机功率和转矩、转速之间的关系
- uCOS3源码解析视频教程-第4季第7部分-朱有鹏-专题视频课程
- 简单的MySQL银行转账实例
- UML实践详细经典教程----用例图、顺序图、状态图、类图、包图、协作图
热门文章
- 改进初学者的PID-采样时间
- 在Amazon FreeRTOS V10中使用运行时统计信息
- JAVA入门级教学之(while循环语句)
- JAVA入门级教学之(编写第一个HelloWorld程序)
- c语言putchar_C语言实现变色的心!连机器都会变心,呵,男人!
- 画股票图csdn_这个股票今天是要弄啥?
- pythongui显示图片_opencv2.4.13+python2.7学习笔记--opencv中的Gui特性--图片:读图像,显示图像,保存图像...
- java mongodb gridfs_查询MongoDB GridFS元数据(Java)
- 2012服务器系统安装iis,Windows Server 2012服务器管理系统安装配置IIS8.5教程
- python22起作业答案_python第22天作业