Bil*_*ill 12 garbage-collection
垃圾收集涉及遍历已分配对象列表(特定代中的所有对象或对象)并确定哪些对象可达.
这个清单是如何保持的?GC语言的运行时是否保留了所有对象的巨大列表?
另外,根据我的理解,GC涉及遍历调用堆栈以查找对象引用 - 算法如何区分GC-able指针和原始数据?
内存管理系统跟踪每个分配对象的大小,就像在C或C++中一样.通常这样做的一种方式是存储器管理系统size_t
在每次分配之前分配额外的,以跟踪每个目标的大小.内存管理器同样必须跟踪每个空闲块的大小,以便它可以重用块来分配它们.
垃圾收集器分两个阶段工作:标记阶段和扫描阶段.在标记阶段,垃圾收集器启动遍历对象引用,以便查找仍可访问的对象.垃圾收集器从存储对象引用的几个基本位置开始,并给出名称(堆栈,全局存储和静态存储),然后遍历对象中的引用.
在扫描阶段,垃圾收集器从下到上遍历堆,从分配跳转到基于size_t
s的分配,并释放任何未标记的内容.
某些语言(如Ruby)标记所有基元,以便在运行时可以与对象引用分开标识它们.其他垃圾收集器是保守的,并遵循灵长类动物,因为它们是对象引用(尽管必须执行一些检查以确保垃圾收集器不会在其他对象的中间粘贴标记).还有其他语言使用运行时类型信息来更精确地确定它们是否遵循灵长类动物.
Ruby的垃圾收集器有时称为"保守",因为它不检查堆栈上的空间是否实际被使用,因此它有时通过跟踪堆栈上的ghost引用来保持死对象的活动.但由于它总是确切地知道它所看到的数据是参考还是原始数据,所以我在这里并不称其为保守.