增量式垃圾回收

为了控制最大暂停时间,通过逐渐推进垃圾回收即垃圾回收与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算法的更多相关文章

  1. 垃圾回收GC3种算法的衍生品 增量回收:预测和控制GC所产生的中断时间

    小结: 1.GC和程序处理的本质是无关的: 2.增量回收:预测和控制GC所产生的中断时间: 1. 分代回收 GC和程序处理的本质是无关的,因此它所消耗的时间越短越好.分代回收的目的,正是为了在程序 运 ...

  2. 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类

    不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...

  3. 位置式PID与增量式PID算法

    位置式PID与增量式PID算法  PID控制是一个二阶线性控制器     定义:通过调整比例.积分和微分三项参数,使得大多数的工业控制系统获得良好的闭环控制性能.     优点             ...

  4. 【转】位置式、增量式PID算法C语言实现

    位置式.增量式PID算法C语言实现 芯片:STM32F107VC 编译器:KEIL4 作者:SY 日期:2017-9-21 15:29:19 概述 PID 算法是一种工控领域常见的控制算法,用于闭环反 ...

  5. 增量学习不只有finetune,三星AI提出增量式少样本目标检测算法ONCE | CVPR 2020

    论文提出增量式少样本目标检测算法ONCE,与主流的少样本目标检测算法不太一样,目前很多性能高的方法大都基于比对的方式进行有目标的检测,并且需要大量的数据进行模型训练再应用到新类中,要检测所有的类别则需 ...

  6. T12焊台控制器制作教程 | T12烙铁 | PID增量式算法恒温控制 | 运算放大器-热电偶电压采集 | OLED屏幕显示-SPI通信 | 旋转编码器EC11用户操作

    前言 购买T12烙铁的相关配件已经1年多了,期间也尝试了一些开源的T12控制器,但都没有成功,要么是配套资料少,要么是英文的,其中51和arduino的居多,STM32的较少.求人不如求己,索性自己开 ...

  7. 《垃圾回收的算法与实现》——Python垃圾回收

    Python垃圾回收 python采用引用计数法进行垃圾回收 Python内存分配 python在分配内存空间时,在malloc之上堆放了3个独立的分层. python内存分配时主要由arena.po ...

  8. 增量式PID简单翻板角度控制

    1.研究背景 随着电子技术.信息技术和自动控制理论技术的完善与发展,近来微型处理器在控制方面的应用也越来越多.随之逐渐渗透到我们生活的各个领域.如导弹导航装置,飞机上仪表的控制,网络通讯与数据传输,工 ...

  9. C 语言实现增量式PID

    一直以来,pid都是控制领域的经典算法,之前尝试理解了很久,但还是一知半解,总是不得要领,昨天模仿着别人的代码写了一个增量式pid的代码. 我的理解就是pid其实就是对你设置的预定参数进行跟踪.在控制 ...

随机推荐

  1. hdu 1205 吃糖果【鸽巢原理】

    题目 这道题不难,看别人博客的时候发现大家都说用鸽巢原理,这是个什么鬼,于是乎百度之. 1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n+1块区域,至少需要n-1块其他种糖果才能使得所有隔板不挨 ...

  2. <context:component-scan>自动扫描

    主要讲解自动扫描的<context:component-scan>中的2个子标签的使用方法 在Spring MVC中的配置中一般会遇到这两个标签,作为<context:compone ...

  3. Android Sqlite 增删改查

    模拟 查询所有数据,增加一条数据,修改某一条数据,删除某一条数据: SQLiteOpenHelper 帮助类的介绍: import android.content.Context; import an ...

  4. Python学习-2.安装IDE

    Python安装包中已经包含了一个IDE了,叫IDLE,可以在Python的安装目录内找到路径为 ./Lib/idlelib/idle.bat 或者可以在开始菜单中找到. 但是这个IDE功能很弱,缺少 ...

  5. LeetCode141:Linked List Cycle

    题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without usin ...

  6. linux系统编程之管道(三):命令管道(FIFO)

    一,匿名管道PIPE局限性 管道的主要局限性正体现在它的特点上: 只支持单向数据流: 只能用于具有亲缘关系的进程之间: 没有名字: 管道的缓冲区是有限的(管道制存在于内存中,在管道创建时,为缓冲区分配 ...

  7. asp.net使用SpeechSynthesizer类生成语音文件部署到iis遇到的几个坑

    首先需要引入命名空间System.Speech.Synthesis,代码如下: using (var speechSyn = new SpeechSynthesizer()) { speechSyn. ...

  8. 基于MVC框架Aspose.Words打印到Word中写法

    控件bin文件下载地址:https://download.csdn.net/download/u012949335/10610726 //前端打印写法 @{ ViewBag.Title = " ...

  9. 实现liunx之间无密码访问——ssh密匙

    环境描述 两台linux服务器 172.16.1.22[client],172.16.1.33[server],想要实现client服务器ssh无密码访问server服务器. 使用技术 linux 的 ...

  10. .NET Core中使用Dapper操作Oracle存储过程最佳实践

    为什么说是最佳实践呢?因为在实际开发中踩坑了,而且发现网上大多数文章给出的解决方法都不能很好地解决问题.尤其是在获取类型为OracleDbType.RefCursor,输出为:ParameterDir ...