教程演示🔗
自动内存管理技术
你将学到什么
-
计算机程序中自动内存管理背后的算法和数据结构。
-
内存管理历史:静态、堆栈、堆分配
-
虚拟内存和内存布局
-
追踪与直接收集器
-
语义垃圾与语法垃圾
-
标记-清除垃圾收集器
-
马克紧凑型收集器
-
引用计数收集器
-
复制收集器
-
世代收藏家
-
并行、增量、并发收集器
-
三色抽象和标记
-
气相色谱屏障
要求
-
基本数据结构和算法(树、图、链表等)
-
有关计算机内存的基础知识(字节、地址、指针)
描述
垃圾收集器的要点
内存泄漏和悬空指针是手动内存管理的主要问题。您删除了链表中的父节点,却忘记先删除其所有子节点,这样您的内存就会泄漏。您以正确的顺序删除了一个对象链 – 但突然您的程序崩溃了,因为您忘记了该资源的第二个所有者,该资源现在尝试取消引用空指针。
为了避免这些问题,大多数现代高级编程语言都实现了自动内存管理。您手动分配对象,但不必担心它们的释放:一个特殊的程序,垃圾收集器,知道如何自动正确地释放它们,并回收以供将来重用。
在垃圾收集器基础课程中,我们研究了与自动内存管理相关的所有不同技术和算法,这些技术和算法目前已在实践中使用。
这门课适合谁?
首先,对于编译工程师来说。
在实现编程语言时,您很有可能需要实现垃圾收集器。即使是最初被定位为“内存安全”的语言,例如 Rust,最终也实现了自动引用计数(ARC)和其他收集器。
重申一下:在大多数现代高级编程语言中,垃圾收集器模块(或多个GC 模块,如 Java)现在几乎是必需的。
如果我不每天都实现编程语言怎么办?
如果您不是编译器工程师,那么该课程对您来说仍然很有趣。一般来说,实现垃圾收集器或内存管理器是一项非常高级的工程任务。这是一个简单的技巧:你采取一些复杂的项目(例如垃圾收集器、编译器、解释器等),在构建它的同时,你学习所有不同的数据结构和算法。然后回到“日常编程”,通过复杂系统的可转移通用知识,成为一名更好的工程师。
这个项目需要 C 或 C++ 吗?
并不真地!当然,C 和 C++ 可能是原始内存操作的最佳语言,并且非常适合这里,但是在课程中,我们研究通用设计算法,并主要关注垃圾收集器和内存分配器的理论方面。这意味着您可以用任何您想要的语言来实现它们。例如,您可以在 JavaScript 中为虚拟堆分配“ArrayBuffer ”,或者在 Python、Rust 等中分配类似的“bytearray”。
课程中的大多数算法都是用通用伪代码描述的,因此您可以将它们移植到任何语言。
这堂课有什么具体内容?
这些讲座的主要内容是:
- 简洁明了,开门见山。每场讲座都是自给自足、简洁的,描述与主题直接相关的信息,不会分散无关材料或演讲的注意力。
- 动画演示与实时编辑笔记相结合。这使得主题的理解变得更容易,并显示了对象结构如何(以及何时)连接。静态幻灯片根本不适用于复杂的内容。
阅读材料
作为本课程的进一步阅读和补充文献,推荐以下书籍:
- 《垃圾收集手册:自动内存管理的艺术》作者:Antony Hosking、Eliot Moss 和 Richard Jones
- 编译器设计手册:优化和机器代码生成,作者:YN Srikant、Priti Shankar
本课程适合谁:
- 编译工程师
- 所有好奇的工程师,愿意实施一个复杂的项目来学习不同的内存管理算法(通用知识可以转移到其他系统)