35|内存管理第2关:实现垃圾回收
宫文学
你好,我是宫文学。
今天这节课,我们继续上一节课未完成的内容,完成垃圾回收功能。
在上一节课,我们已经实现了一个基于 Arena 做内存分配的模块。并且,我们还在可执行程序里保存了函数、类和闭包相关的元数据信息。
有了上一节课的基础之后,我们这节课就能正式编写垃圾回收的算法了。算法思路是这样的:
首先,我们要有一个种机制来触发垃圾回收,进入垃圾回收的处理程序;
第二,我们要基于元数据信息来遍历栈帧,找到所有的 GC 根;
第三,从每个 GC 根出发,我们需要去标记 GC 根直接和间接引用的内存对象;
最后,我们再基于对象的标记信息,来回收内存垃圾。
在今天这节课,你不仅仅会掌握标记 - 清除算法,其中涉及的知识点,也会让你能够更容易地实现其他垃圾回收算法,并且让我们的程序能更好地与运行时功能相配合。
那接下来,我们就顺着算法实现思路,看看如何启动垃圾回收机制。
启动垃圾回收机制
在现代的计算机语言中,我们可以有各种策略来启动垃圾回收机制。比如,在申请内存时,如果内存不足,就可以触发垃圾回收。甚至,你也可以每隔一段时间就触发一下垃圾收集。不过不论采取哪种机制,我们首先要有办法从程序的正常执行流程,进入垃圾回收程序才行。
进入垃圾回收程序,其实有一个经常使用的时机,就是在函数返回的时候。这个时候,我们可以不像平常那样,使用 retq 跳回调用者,而是先去检查是否需要做垃圾回收:如果需要做垃圾回收,那就先回收完垃圾,再返回到原来函数的调用者;如果不需要做垃圾回收,那就直接跳转到函数的调用者。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了内存管理中的垃圾回收实现方法,重点介绍了基于Arena的内存分配模块以及垃圾回收算法的实现思路。作者首先介绍了触发垃圾回收的机制、遍历栈帧找到GC根、标记内存对象以及回收内存垃圾的方法。文章还提到了在函数返回时触发垃圾回收程序的时机,并给出了相应的示例代码。此外,文章还介绍了遍历栈帧和对象的方法,以及如何查找函数的元数据。尽管算法存在一些缺陷,但对于想要深入了解内存管理的读者具有很高的参考价值。整体而言,本文内容深入浅出,为读者提供了对垃圾回收算法的全面理解。文章还提到了垃圾回收算法的测试和课程小结,以及对垃圾回收机制的优化思考。通过这些内容,读者可以获得对内存管理的深入了解,并对垃圾回收算法的实现和优化有所启发。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一门编程语言》,新⼈⾸单¥59
《手把手带你写一门编程语言》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(4)
- 最新
- 精选
- 奋斗的蜗牛太强了,轻轻松松就把这么复杂的知识讲明白2021-11-042
- 写点啥呢请问宫老师,为何GC操作的实现frame_walker只检查栈中的对象root,存在于寄存器中引用的对象我理解也应该是有效live的。请老师指点,谢谢2021-11-032
- James Deng宫老师,想请教一下,JVM垃圾回收在代码的位置设计了安全点,有test()机制,这个与我们的playscript有什么区别吗?2022-11-16归属地:广东
- ifelse学习打卡2022-09-30归属地:浙江
收起评论