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

34|内存管理第1关:Arena技术和元数据

你好,我是宫文学。
通过前面 8 节课的学习,我们实现了对浮点数、字符串、数组、自定义对象类型和函数类型的支持,涵盖了 TypeScript 的一些关键数据类型,也了解了实现这些语言特性所需要的一些关键技术。
在这些数据类型中,字符串、数组、class 实例,还有闭包,都需要从堆中申请内存,但我们目前还没有实现内存回收机制。所以,如果用我们现在的版本,长时间运行某些需要在堆中申请内存的程序,可能很快会就把内存耗光。
所以,接下来的两节课,我们就来补上这个缺陷,实现一个简单的内存管理模块,支持内存的申请、内存垃圾的识别和回收功能。在这个过程中,你会对内存管理的原理产生更加清晰的认识,并且能够自己动手实现基本的内存管理功能。
那么,首先我们要分析一下内存管理涉及的技术点,以此来确定我们自己的技术方案。

内存管理中的技术点

计算机语言中的内存管理模块,能够对内存从申请到回收进行全生命周期的管理。
内存的申请方面,一般不会为每个对象从操作系统申请内存资源,而是要提供自己的内存分配机制。
而垃圾回收技术则是内存管理中的难点。垃圾回收有很多个技术方案,包括标记 - 清除、标记 - 整理、停止 - 拷贝和自动引用计数这些基础的算法。在产品级的实现里,这些算法又被进一步复杂化。比如,你可以针对老的内存对象和新内存对象,使用不同的回收算法,从而形成分代管理的方案。又比如,为了充分减少由于垃圾收集所导致的程序停顿,发展出来了增量式回收和并行回收的技术。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了内存管理的关键技术和实现方法,涉及垃圾回收算法、内存申请释放、元数据管理等重要内容。首先介绍了垃圾回收的标记-清除算法原理和实现方式,以及内存的申请和释放中的Arena技术。其次,强调了遍历栈帧和内存对象的重要性,以及保存函数、类和闭包等元数据信息的必要性。文章还详细讨论了如何管理元数据,包括变量布局信息、类的元数据、数组对象和闭包的处理方式。最后,总结了垃圾收集算法、内存分配功能和元数据信息的重要性,以及它们在程序调试和未来元编程功能中的作用。整体而言,本文对内存管理的关键技术和实现方法进行了深入浅出的介绍,对读者理解内存管理原理和实践具有一定的指导意义。

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

全部留言(5)

  • 最新
  • 精选
  • 有学识的兔子
    .asciz 代表以"\0"作为结束符的字符串; .p2align代表数据边界需要满足对齐的字节倍数;.quad:代表大数,8字节的整数; 要数据区写4个字节整数,是不是类似如下,声明数据段然后填入数据? .section __DATA,__const .globl _foo.meta ## can be accessed globally .p2align 2 ## 4 byte alignment _foo.meta: .word _val ##4字节整数
    2021-11-07
    2
  • 奋斗的蜗牛
    .asciz用来声明字符串,.p2align用来声明下一条指令所在位置的对齐要求,.quad声明8字节的数
    2021-11-02
    1
  • ...
    是否选择使用C语言编写才需要考虑内存管理 使用JS编译的话内存管理会由JS完成
    2021-11-02
    1
  • 奋斗的蜗牛
    这节课知识量很大,看来汇编语言还是很重要
    2021-11-01
    1
  • ifelse
    学习打卡
    2022-09-29归属地:浙江
收起评论
显示
设置
留言
5
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部