8.5 垃圾收集

发布时间 2023-07-31 16:31:05作者: C~A
垃圾收集器(garbage collector)是一种动态内存分配器,它自动释放程序不再需要的已分配块。这些块被称为垃圾(garbage)(因此术语就称之为垃圾收集器)。自动回收堆存储的过程叫做垃圾收集(garbage collection)。在一个支持垃圾收集的系统中,应用显式分配堆块,但是从不显示地释放它们。在C程序的上下文中,应用调用malloc,但是从不调用free。反之,垃圾收集器定期识别垃圾块,并相应地调用free,将这些块放回到空闲链表中。
垃圾收集器将内存视为一张有向可达图(reachability graph),其形式如图所示。该图的节点被分成一组根节点(root node)和一组堆节点(heap node)。每个堆节点对应于堆中的一个已分配块。有向边p→q意味着块p中的某个位置指向块q中的某个位置。根节点对应于这样一种不在堆中的位置,它们中包含指向堆中的指针。这些位置可以是寄存器、栈里的变量,或者是虚拟内存中读写数据区域内的全局变量。

当存在一条从任意根节点出发并到达的有向路径时,我们说节点p是可达的(reachable)。在任何时刻,不可达节点对应于垃圾,是不能被应用再次使用的。垃圾收集器的角色是维护可达图的某种表示,并通过释放不可达节点且将它们返回给空闲链表,来定期地回收它们。