垃圾收集

垃圾收集(Garbage Collection)是一种自动内存管理机制,分配器自动回收程序不再使用的内存块。它对应于隐式分配器。

可达性分析

  • 从一组称为根集(root set) 的指针出发,进行图的遍历。
  • 根集包括:栈中的局部变量、全局变量、寄存器中的指针等。
  • 从根集不可达的堆块被视为垃圾,可以回收。

标记-清扫(Mark & Sweep)算法

  1. 标记阶段:从根集出发,递归标记所有可达的已分配块。每个块头部通常有一位用于标记。
  2. 清扫阶段:遍历堆中所有块,将未标记的已分配块视为垃圾并回收(释放),同时清除标记位供下一轮使用。

与分配器的整合

  • 垃圾收集器通常建立在某种空闲链表分配器之上(如隐式空闲链表)。
  • 垃圾收集器需要知道哪些是有效的指针(type tagging或保守式收集)。

保守式垃圾收集

  • C语言没有运行时类型信息,收集器无法准确判断一个整数的值是指针还是普通数据。
  • 保守的做法是:将”看起来像指针”的值当作指针处理,不移动任何块。
  • 优点是无需修改C编译器;缺点是有时无法回收本应回收的块。

链接到