《垃圾回收的算法与实现》——增量式垃圾回收与RC Immix算法
增量式垃圾回收
为了控制最大暂停时间,通过逐渐推进垃圾回收即垃圾回收与mutator交替执行。
三色标记算法
以标记-清除算法为例使用三色标记算法。
利用降低吞吐量来缩短最大停顿时间。
基础
- 将GC中对象分成三种颜色:
- 白色:还未搜索过
- 灰色:正在搜索
- 黑色:搜索完成
- 增量式的GC标记-清除算法分成以下三个阶段:
- 根查找阶段
- 标记阶段
- 清除阶段
执行过程
- 根查找阶段,直接将GC root直接引用的对象从白色涂为灰色,并将其加到标记栈。
- 标记阶段,每次标记一定数量对象,从标记栈中取出对象将其子对象涂成灰色,当标记阶段要结束时再次将GC root的直接引用的对象加入到标记栈,再次标记。
- 清除阶段,当标记栈为空时,每次清除一定数量的白色对象,对此执行次步骤直到遍历完整个堆。
写入屏障
- 由于标记阶段是多次完成的,因此可能产生“标记遗漏”即从黑色对象指向白色对象的指针。此时该白色的活跃对象会被认为是垃圾。
- 通过写入屏障解决,在修改指针时如果新引用的对象是白色的就将其标为灰色(加入到标记栈)
分配
- 分配时检查可用空间是否小于某个值,小于则开始进行GC(Mark-Sweep是内存不足才进行GC)。
- 分配时如果GC处于清除阶段,且分配位置还未遍历则需要给该对象标为黑色。
Steele的算法
- 标记阶段加入到标记栈时不设置标志,而是在遍历子对象时设置其标记标志。
- 写入屏障增加条件,标记过程中发生引用的对象是黑色对象且新的引用的目标对象为灰色或白色,则将发出引用的对象涂成灰色。
汤浅的算法
-原则:基于在GC开始时保留活动对象。
- 标记阶段不需要进行重新遍历GC root,因为其在写入屏障中如果GC处于标记阶段则将对该对象加入标记栈。
- 分配时如果处于标记阶段则将对象设为黑色。
RC Immix算法
合并型引用计数法
- 引用计数法由于频繁修改计数器导致吞吐量不高。设计一种把注意力放在某一时期最初和最后状态上,这期间不对计数器做修改,即合并型引用计数法。
- 引入更改缓冲区,指针的改动记录到该缓冲区。
- 当指针发送改变时将指针发送改变的对象和其所有子对象注册到更改缓冲区,通过写入屏障实现。
- 对象增加dirty标志,用于记录该对象是否写入了缓冲区。
- 当缓冲区满了时进行GC,先对对象当前的引用的子对象进行增量,而后对更改缓冲区记录的子对象进行减量,从而实现了对计数器的恢复。
- 优点在于增加了吞吐量
- 缺点则是增加了最大停顿时间
合并型引用计数法和Immix的融合
- 回收以线为对象,如果线内没有一个活动对象则回收该线。
- 线也增加计数器,表示线内存活对象数。
- 所有没经历过GC的新对象均会记录在更改缓冲区,在GC时只对新对象进行复制算法,实现被动的碎片整理。
- 积极的碎片整理,采用标记-压缩算法,选择一个块进行。
《垃圾回收的算法与实现》——增量式垃圾回收与RC Immix算法的更多相关文章
- 垃圾回收GC3种算法的衍生品 增量回收:预测和控制GC所产生的中断时间
小结: 1.GC和程序处理的本质是无关的: 2.增量回收:预测和控制GC所产生的中断时间: 1. 分代回收 GC和程序处理的本质是无关的,因此它所消耗的时间越短越好.分代回收的目的,正是为了在程序 运 ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- 位置式PID与增量式PID算法
位置式PID与增量式PID算法 PID控制是一个二阶线性控制器 定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能. 优点 ...
- 【转】位置式、增量式PID算法C语言实现
位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...
- 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020
论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...
- T12焊台控制器制作教程 | T12烙铁 | PID增量式算法恒温控制 | 运算放大器-热电偶电压采集 | OLED屏幕显示-SPI通信 | 旋转编码器EC11用户操作
前言 购买T12烙铁的相关配件已经1年多了,期间也尝试了一些开源的T12控制器,但都没有成功,要么是配套资料少,要么是英文的,其中51和arduino的居多,STM32的较少.求人不如求己,索性自己开 ...
- 《垃圾回收的算法与实现》——Python垃圾回收
Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...
- 增量式PID简单翻板角度控制
1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...
- C 语言实现增量式PID
一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...
随机推荐
- Java火焰图在Netflix的实践
转自 http://www.infoq.com/cn/news/2015/08/java-flamegraph 亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要 ...
- HashMap底层实现原理以及HashMap与HashTable区别以及HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- SQL SERVER 2008 附加数据库出现只读问题。
问题描述 在附加数据库时出现的图片: 解决办法 步骤一,修改文件夹的 1.打开该数据库文件存放的目录或数据库文件的属性窗口,选择"属性"菜单->选择"安全&qu ...
- [ACM_模拟] UVA 12504 Updating a Dictionary [字符串处理 字典增加、减少、改变问题]
Updating a Dictionary In this problem, a dictionary is collection of key-value pairs, where keys ...
- LeetCode149:Max Points on a Line
题目: Given n points on a 2D plane, find the maximum number of points that lie on the same straight li ...
- [翻译]NUnit---Property and Random Attributes(十四)
小记:由于工作琐碎,没得心情翻译而且也在看<CLR vis C#>,所以断更了差不多5个月,现在继续翻译,保证会翻译完成,不会虎头蛇尾. 另:NUnit已经更新到2.6.3版本,虽然正在开 ...
- wpf expender 展开动画
非原创,网上下载的,觉得还可以,记录一下以便以后查看学习 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2 ...
- App.config使用方法(基础教程)
WPF程序中的App.config文件是应用程序中经常使用的一种配置文件,System.Configuration.dll文件中提供了大量的读写的配置,是一种很高效的程序配置方式. 1.首先在工程中配 ...
- C# VS .NET 版本对应关系
╔══════╦══════╦═══════╦════ ══╦═══════╗ ║ C# version ║ VS version ║ .NET version ║ CLR version ║ Rel ...
- 使用css保持一定宽高比例
需求描述:移动端实现横跨页面半圆.(类似问题,实现4x4的正方形网格) 简化问题,我们可以理解为实现一个高度和宽度比为1:2的块. 需要解决问题: 1,高度和宽度按照一定比例. 2,外容器高度和宽度不 ...