关于LuaGC算法的演化概述

news2024/11/21 1:27:42

2年不用,就忘了,在这记录下。

5.0版本的双色标记清除算法

此算法中,每个对象会有两种标记态:白色和黑色;新创建的对象都是白色

过程:

1.初始化阶段:将root链表中的所有对象放入待检链表中;

2.标记阶段:循环取出待检链表中的对象,标记为黑色,并遍历这个对象关联的其他对象,标记黑色;

3.回收阶段:将白色回收。黑色放回对象链表等待下一次GC

问题:GC无法被打断,标记和回收必须一气呵成。否则新创建的标白可能会被回收,标黑?我没检测就标黑,不行。

5.1版本的三色增量标记清除算法

此算法中,解决了GC无法被打断的问题,GC过程可以被打断;每个对象会有三种标记态:白色,灰色,黑色;新创建的对象都是白色

过程:

1.初始化阶段:将root链表中的所有对象标为灰色,放入灰色链表中;

2.标记阶段:循环取出灰色链表中的对象,标记为黑色,并遍历这个对象关联的其他对象,如果是白色,则标为灰色,放入灰色链表中;否则表为黑色;

3.回收阶段:将白色回收。黑色放回对象链表等待下一次GC

优化:解决了无法被打断的问题,只要灰色链表中还存在元素,这个GC过程就会一直持续下去,即使打断了也没有影响。并且新增对象时,若处于标记阶段,就可以将新的对象标为灰色待检,不会被无情抹掉。

问题:如果处于回收阶段,新创建了对象,仍然会被无情回收。

5.1增强版本 引入“双白色”概念

此算法中,每个对象会有四种标记态:当前白(白1),非当前白(白2),灰色,黑色;新创建的对象视情况标为白1或白2

过程:第N次GC时,使用白1作为要回收的白色,而在此期间新创建的对象统一用白2标记,避免被无情回收。

第N+1次GC时,使用白2作为要回收的白色,而在此期间新创建的对象同意用白1标记,避免被无情回收。

(这次回收白1,新来的都用白2;下次回收白2,新来的都用白1)

优化:解决5.1版本存在的问题

5.2版本之后的分代GC

5.2版本之前的GC都是分步GC,每次GC都全轮一遍标记回收。而从5.2开始,出现了分代模式。可以通过主动调用进行设置。其特点跟C#的GC类似。分为了多代对象,有不同的GC策略,提高了GC性能。

分代GC主要分两个GC过程,一个是完整的GC(即major GC),其二是局部GC(即minor GC)。会根据新增内存量以及回收量决定下一次的GC策略。

状态标识枚举:

G_NEW(0代对象):本次cycle创建的新对象(没有引用任何old对象)

G_SURVIVAL(1代对象):上一轮cycle创建的对象 -- 只活过一轮,下一次如果是白色的话,仍然会被回收。

G_OLD0(1代对象):表示本次cycle创建的新对象,但是引用了old对象

以下是老年代对象:

G_OLD1(2代对象):表示作为老对象第一次存活了整个gc过程 -- 为什么需要G_OLD1(从G_SURVIVAL或者G_OLD0变成G_OLD1,而不是直接从G_SURVIVAL或者G_OLD0变成G_OLD)?因为如果节点A现在是在G_SURVIVAL或者G_OLD0,在同一个cycle中转成old对象前,有一个子节点B引用了A节点(例:A[B]=C),这时候因为A节点仍然不是old,所以不会触发到barrier与barrier_back操作,所以节点B仍然是G_NEW,到最后,A节点直接转变成G_OLD的话,B节点转变成G_SURVIVAL,因为在youngcollection中不会对g->reallyold链表进行markold操作,所以在下一次gc中,如果B节点不可达(即是白色)的话,那么在这次gc中会被释放。虽然可以改成old也传播,但是这样的话就破坏了规则(会对所有的G_OLD都遍历,这样就达不到缩减成本的目的了)。

G_OLD(3代对象):表示真正的old对象,不会被回收 -- 作为老对象需要2次gc过程,作为新创建的对象需要经过3次gc才会到达此阶段。

G_TOUCHED1(3代对象):标记位G_OLD的对象在这次gc barrier_back的状态 -- 新touch的对象,需要进入到grayagain中

G_TOUCHED2(3代对象):标记为G_OLD的对象在上一次gc barrier_back的状态前进到touched2 -- 分代gc结束时,从G_TOUCHED1转成G_TOUCHED2,并设置为黑色,仍然存在于grayagain中,以便下一轮再次有新对象使该对象 barrier_back 时,只需要修改为灰色(使用计算机的局部性原理,这次用到的东西,下一次可能还会触发,避免下次触发时进行链表的操作)。如果下一次没有触发为touched1则变成G_OLD。在correctgraylist中会对touched2跟old的对象从grayagain删除。(参考文章)

 

时刻保持对代码的敬畏之心,我是一个游戏码农,一个追梦的人。
喜欢就点个关注吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/80351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0204隐函数及由参数方程所确定的函数的导数相关变化率-导数与微分

1 隐函数 定义:设有两个非空数集A,BA,BA,B.对于∀x∈A\forall x\in A∀x∈A,由二元方程F(x,y)0F(x,y)0F(x,y)0对应唯一的y∈By\in By∈B,称此对应关系是二元方程F(X,y)0F(X,y)0F(X,y)0确定的隐函数。 相应的由yf(x)yf(x)yf(x)确定的对应关系称为显函数。…

vue.js:作用域插槽的使用案例

作用域插槽的使用理解 父组件替换插槽的标签,但是内容是由子组件提供的。 案例需求 子组件中包含一组数据,比如:pLanguages:[‘Java’,‘c’,‘JavaScript’,‘python’,‘C语言’,‘Go’,‘C#’]现需要在多个页面进行操作&…

19.8 适配器概念、分类、范例与总结

一:适配器基本概念 把一个既有的东西进行适当的改造,比如增加点东西,或者减少点东西,就构成了一个适配器。 三种适配器:容器适配器、算法适配器、迭代适配器。 二:容器适配器 本章第三节学习过双端队列de…

个人有效:关于VMware虚拟机开机蓝屏问题的解决

文章目录前言禁用Hyper-V等服务Device 服务等启动相关是否需要VMware最新版本电脑虚拟化问题启用或关闭windows功能的设置关于VMware虚拟机的卸载参考前言 搜了海量文章,实操过大部分的方法,一顿折腾、最后莫名其妙的能跑了…。~~两天来急痛攻心&#xf…

Hot100-寻找重复数

1 前言 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 1.1 暴力解法 两次for循环&#xff1a…

spring——AOP面向切面编程—— 一般切面的 AOP 开发

一般切面的 AOP 开发 当我们在使用 Spring AOP 开发时,若没有对切面进行具体定义,Spring AOP 会通过 Advisor 为我们定义一个一般切面(不带切点的切面),然后对目标对象(Target)中的所有方法连接点进行拦截,并织入增强代码。 工程依…

Pytest----测试脚本上传git代码仓库

【原文链接】Pytest----测试脚本上传git代码仓库 在企业实战中,自动化测试脚本也要放在代码管理平台的,可以选择第三方公共的git代码托管平台,比如github、gitee等,当然也可以在企业内部搭建gitlab作为代码托管平台,他…

蓝桥杯模拟赛习题练习(一)

题目来源:第十四届蓝桥杯模拟赛第一期 注:代码都是自己写的,不是参考答案! 1. 二进制位数 问题描述: 十进制整数2在十进制中是1位数,在二进制中对应10 ,是2位数。 十进制整数22在十进制中是2位…

Linux系统调用实现简析

1. 前言 限于作者能力水平,本文可能存在的谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 本篇基于 Linux 4.14 ARM 32 glibc-2.31 进行分析。 3. 系统调用的实现 3.1 系统调用的发起 3.1.1 起于用户空间 我们随意挑选一个…

python学习之:妙用魔法函数 __dict___来调用对象中的方法,或者 python文件中的方法

文章目录场景原始写法升级写法面向对象的写法总结场景 原始写法 假设现在有一个文件 tool.py我想在外部输入一个 字符串 就调用这个字符串对应的函数如果你不是用 __dict__ 这个好用的函数,那么你大概率会以下面的方式去写 main 函数,给很多 if但是如果…

网络安全观察报告 态势总览

执行摘要 从 1987 年 9 月 14 日,中国向世界发出第一封电子邮件 到如今,中国的互联网发展已过去整整 31 个年头。从消费互联、产业互联到万物互联,互联网正在加速改变我们的交流方式和交易方式,一次次 004.重塑了国家的经济形态和…

创建型 - 单例模式(Singleton pattern)

单例模式(Singleton Pattern):确保一个类有且只有一个实例,并提供一个全局访问点。 文章目录懒汉式-线程不安全饿汉式-线程安全懒汉式-线程安全双重校验锁-线程安全静态内部类实现枚举实现实现方式总结使用场景JDK懒汉式-线程不安…

论文(world、WPS)插入参考文献引用详细教程

一、参考资料 如何在WPS中添加论文参考文献 【Word】怎样给论文添加引用参考文献 word添加各种引用 二、相关介绍 1. 参考文献的标注 参考文献的标注分为全部引用、局部引用、间接引用。 1.1 全部引用(直接引用) 需要双引号,无论冒号…

[附源码]Python计算机毕业设计SSM基于的社区疫情管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)

硬件准备** ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 使用到硬件模块原理图 功能介绍 四线电阻式触摸屏,拿笔和指甲划拉的,不是现在的容性触摸屏。 ADSP-EDU-BF53x 板卡的 …

《Docker》阿里云服务器docker部署nginx并配置https踩坑记录(完整)

前端博主,热衷各种前端向的骚操作,经常想到哪就写到哪,如果有感兴趣的技术和前端效果可以留言~博主看到后会去代替大家踩坑的~ 主页: oliver尹的主页 格言: 跌倒了爬起来就好~ 来个关注吧,点个赞…

# Docker说明、安装(Windows10家庭版)

Docker说明、安装(Windows10家庭版) Docker是什么?它是干嘛的? 开始,我就知道别人说是用来加工tar包的。tar包?又是干什么用的? tar包,个人粗俗的理解就是一个环境,里面…

CVPR2021 | VQGAN+:Taming Transformers for High-Resolution Image Synthesis

原文标题:Taming Transformers for High-Resolution Image Synthesis 主页:Taming Transformers for High-Resolution Image Synthesis 代码:https://github.com/CompVis/taming-transformers transformer比CNN缺少了归纳偏置和局部性&…

音视频编解码经典问题汇总(1)

前言: 大家好,今天给大家分享的内容是关于平时在做音频编解码会遇到的一些问题,比如说:解码播放的时候,播不出来解码播放的时候,画面有条纹编码的时候,修改分辨率大小,没有反应这三个…

【NumPy 数组副本 vs 视图、NumPy 数组形状、重塑、迭代】

🤵‍♂️ 个人主页老虎也淘气 个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏…