手把手带你写一门编程语言
宫文学
北京原点代码 CEO
7534 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
起步篇:让一门超简单的语言跑起来 (21讲)
结束语 (1讲)
手把手带你写一门编程语言
15
15
1.0x
00:00/00:00
登录|注册

35|内存管理第2关:实现垃圾回收

你好,我是宫文学。
今天这节课,我们继续上一节课未完成的内容,完成垃圾回收功能。
在上一节课,我们已经实现了一个基于 Arena 做内存分配的模块。并且,我们还在可执行程序里保存了函数、类和闭包相关的元数据信息。
有了上一节课的基础之后,我们这节课就能正式编写垃圾回收的算法了。算法思路是这样的:
首先,我们要有一个种机制来触发垃圾回收,进入垃圾回收的处理程序;
第二,我们要基于元数据信息来遍历栈帧,找到所有的 GC 根;
第三,从每个 GC 根出发,我们需要去标记 GC 根直接和间接引用的内存对象;
最后,我们再基于对象的标记信息,来回收内存垃圾。
在今天这节课,你不仅仅会掌握标记 - 清除算法,其中涉及的知识点,也会让你能够更容易地实现其他垃圾回收算法,并且让我们的程序能更好地与运行时功能相配合。
那接下来,我们就顺着算法实现思路,看看如何启动垃圾回收机制。

启动垃圾回收机制

在现代的计算机语言中,我们可以有各种策略来启动垃圾回收机制。比如,在申请内存时,如果内存不足,就可以触发垃圾回收。甚至,你也可以每隔一段时间就触发一下垃圾收集。不过不论采取哪种机制,我们首先要有办法从程序的正常执行流程,进入垃圾回收程序才行。
进入垃圾回收程序,其实有一个经常使用的时机,就是在函数返回的时候。这个时候,我们可以不像平常那样,使用 retq 跳回调用者,而是先去检查是否需要做垃圾回收:如果需要做垃圾回收,那就先回收完垃圾,再返回到原来函数的调用者;如果不需要做垃圾回收,那就直接跳转到函数的调用者。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了内存管理中的垃圾回收实现方法,重点介绍了基于Arena的内存分配模块以及垃圾回收算法的实现思路。作者首先介绍了触发垃圾回收的机制、遍历栈帧找到GC根、标记内存对象以及回收内存垃圾的方法。文章还提到了在函数返回时触发垃圾回收程序的时机,并给出了相应的示例代码。此外,文章还介绍了遍历栈帧和对象的方法,以及如何查找函数的元数据。尽管算法存在一些缺陷,但对于想要深入了解内存管理的读者具有很高的参考价值。整体而言,本文内容深入浅出,为读者提供了对垃圾回收算法的全面理解。文章还提到了垃圾回收算法的测试和课程小结,以及对垃圾回收机制的优化思考。通过这些内容,读者可以获得对内存管理的深入了解,并对垃圾回收算法的实现和优化有所启发。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • 奋斗的蜗牛
    太强了,轻轻松松就把这么复杂的知识讲明白
    2021-11-04
    2
  • 写点啥呢
    请问宫老师,为何GC操作的实现frame_walker只检查栈中的对象root,存在于寄存器中引用的对象我理解也应该是有效live的。请老师指点,谢谢
    2021-11-03
    2
  • James Deng
    宫老师,想请教一下,JVM垃圾回收在代码的位置设计了安全点,有test()机制,这个与我们的playscript有什么区别吗?
    2022-11-16归属地:广东
  • ifelse
    学习打卡
    2022-09-30归属地:浙江
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部