直接回答
最简单的垃圾回收器是标记-清除(Mark-Sweep)型:维护所有已分配对象的列表,从根集合(全局变量、栈上引用等)出发做图遍历,给可达对象打上标记;然后扫描全部对象,回收未标记的,并清除标记位。配套一个分配接口负责登记新对象。
展开解析
实现要点:每个对象头加一个 mark 位和一个引用列表;根集合要明确,比如解释器里的全局表和调用栈。标记阶段用 DFS/BFS,注意防止环导致死循环(标记位天然解决)。清除阶段把未标记对象释放回空闲列表。易错点包括:遍历中分配新对象导致状态不一致,通常加 GC 暂停(stop-the-world)规避;忘记重置标记位。进阶可谈引用计数(无法处理循环引用)、分代假设、三色标记与增量回收。一个极简实现两三百行 C/Python 即可完成,Toy GC 是常见练习。
示例
class GC:
def __init__(self):
self.objects, self.roots = [], []
def mark(self):
stack = list(self.roots)
while stack:
o = stack.pop()
if not o.marked:
o.marked = True
stack.extend(o.refs)
def sweep(self):
alive = [o for o in self.objects if o.marked]
for o in alive: o.marked = False
self.objects = alive