《垃圾回收的算法与实现》——增量式垃圾回收与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其实就是对你设置的预定参数进行跟踪.在控制 ...
随机推荐
- Tensorflow currently has no official prebuild for your CUDA, cuDNN combination.
INFO CUDA version: 10. ERROR cuDNN not found. See https://github.com/deepfakes/faceswap/blob/master/ ...
- 网络中路由器相关的名词理解LAN,WAN,WLAN
1. LAN,全称Local Area Network,中文名叫做局域网. LAN是指在某一区域内由多台计算机互联成的计算机组.一般是方圆几千米以内. 局域网可以实现文件管理.应用软件共享.打印机共享 ...
- “一键GHOST”系统备份与还原(icmzn)
“一键GHOST”系统备份与还原(icmzn) 1.软件介绍 软件名称:一键GHOST 软件版本:v2014.01.14 安装环境:WINXP/2000/2003/WIN7/VISTA/2008/WI ...
- cocos studio
用了几天,和之前用的cocos creator以及unity的编辑器一对比,很多地方都挺反人类的哈... 拖拽和放大场景元素竟然还要切换一下编辑模式... 移动场景元素竟然没有单独控制x或者y方向的移 ...
- Ubuntu14.04下Pycharm3.4 字体渲染
在ubuntu下搭建了django的开发环境,搭建过程十分简单,Pycharm的安装更简单,下载tar包解压并执行bin目录下的脚本即可,但是看着那个字体真心不爽.于是开始搜索调教. 1.安装打了渲染 ...
- C#存储过程调用的三个方法
//带参数的SQL语句 private void sql_param() { SqlConnection conn = new SqlConnection("server=WIN-OUD59 ...
- dorado-menu
1.menu控件是一个下拉菜单控件,可以设置数icon(图标),click事件,Dorado事件中都有self和arg两个参数,其中self是当前控件本身 2.menu控件可以和toolBar结合使用 ...
- JEECG(三) JEECG minidao如何封装自己的 多表联合查询 分页查询
JEECG确实是一款实实在在的促进生产力的工具好处我想看到此文章的人应该都有所体会了 言归正传 JEECG框架自带的查询确实很省事,但是多表联合查询 分页查询 是我们开发业务系统当中不可避免的这时框架 ...
- JIT与JVM的三种执行模式:解释模式、编译模式、混合模式
Java JIT(just in time)即时编译器是sun公司采用了hotspot虚拟机取代其开发的classic vm之后引入的一项技术,目的在于提高java程序的性能,改变人们“java比C/ ...
- openvswitch 源码分析 OVS_ACTION_ATTR_HASH action
1.在ovs_dp_process_packet中查找kernel缓存流表,查到后执行ovs_execute_actions->do_execute_actions,其中有个actions是OV ...