当前位置: 首页 > news >正文

Ruby的GC机制源码分析(4)

标记

正如说过的那样,ruby 的GC是标记和清除型。具体来说,标记就是设置FL_MARK 标志。搜索已用的VALUE ,设置FL_MARK ,全部检查过之后,再来看对象堆,释放那些没有设置FL_MARK 的对象。

rb_gc_mark()

rb_gc_mark() 是一个递归标记对象的函数。

rb_gc_mark()

首先,RANY() 定义如下。没什么特别的。

RANY()

 295  #define RANY(o) ((RVALUE*)(o))

(gc.c)

首先,检查那些不是指针的东西和已经释放的对象,以及对已标记对象的递归检查。

obj->as.basic.flags |= FL_MARK;

这样obj (也就是函数的参数ptr )就被标记了。之后,顺着从obj 出来的引用进行标记。rb_gc_mark_children() 就是这样。

其它的,从CHECK_STACK() 开始,主要是为了写了些各种各样防止栈溢出的代码。 rb_gc_mark() 使用递归调用对对象进行标记,如果出现大的对象簇,机器栈的长度可能就会不足。在栈要溢出的时候,停止递归,将对象都放到全局列表中,再重新开始标记。因为这部分代码不是主线,省略过去。

rb_gc_mark_children()

下面是rb_gc_mark_children() ,它只是将内部类型罗列出来,然后标记,冗长无趣。这里省略了一些纯粹是枚举的部分。

rb_gc_mark_children()

rb_gc_mark() 是递归的调用,确认这点就可以了。省略的部分分别是NODET_xxxx 的枚举。 NODE 的事会在第二部分介绍。

T_DATA (用于扩展程序库的结构体)标记的部分需要确认一下。这段代码是从第二个switch 语句中提取出来的。

rb_gc_mark_children() -T_DATA

 789        case T_DATA:
790 if (obj->as.data.dmark) (*obj->as.data.dmark)(DATA_PTR(obj));
791 break;

(gc.c)

这里用的不是rb_gc_mark() ,也不是与之类似的函数,而是来自用户的函数dmark 。其中当然应该用到rb_gc_mark() ,不过,也可能不用。比如,一个极端的情况,用户定义的对象中不包含VALUE 就无需标记了。


相关文章:

  • 【随笔】android开发的学习路线
  • 第十章学习笔记总结
  • S3C2440-AD应用
  • 【JavaScript知识点七】 javascript 字符串函数
  • Molehill 3D APIs - GPU硬件加速的Flash 3D API
  • DirectX
  • maven学习讲解
  • 3D游戏引擎的基本架构
  • 思维的划分
  • APP交互
  • Android-播放视频简单案例
  • 近期的一些安排
  • Largest Rectangle in Histogram题解
  • 百度即将开源JavaScript框架Tangram
  • spring载入外部配置文件的方法
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 03Go 类型总结
  • C++类中的特殊成员函数
  • JavaScript学习总结——原型
  • Laravel 菜鸟晋级之路
  • Making An Indicator With Pure CSS
  • SOFAMosn配置模型
  • supervisor 永不挂掉的进程 安装以及使用
  • 笨办法学C 练习34:动态数组
  • 从0到1:PostCSS 插件开发最佳实践
  • 从输入URL到页面加载发生了什么
  • 第十八天-企业应用架构模式-基本模式
  • 机器学习 vs. 深度学习
  • 力扣(LeetCode)965
  • 区块链技术特点之去中心化特性
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 数据结构java版之冒泡排序及优化
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 微信小程序填坑清单
  • 在weex里面使用chart图表
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • HanLP分词命名实体提取详解
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #《AI中文版》V3 第 1 章 概述
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (Python第六天)文件处理
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二十四)Flask之flask-session组件
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)ssm码农论坛 毕业设计 231126
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • .bat批处理出现中文乱码的情况
  • .net core Swagger 过滤部分Api
  • .NET Core WebAPI中使用swagger版本控制,添加注释