#垃圾回收 #垃圾 #内存 #API

gc_api

多线程垃圾回收器的通用抽象

4个版本 (重大更改)

0.5.0 2023年1月19日
0.4.0 2022年12月15日
0.3.0 2022年12月12日
0.1.0 2022年5月10日

#508内存管理

MIT/Apache

42KB
850

gc_api

基于特质的Rust通用垃圾回收器API。此项目目前存在是为了制定此类API可能的外观,同时支持广泛的垃圾回收器类型/实现。

此crate仍在开发中。任何反馈或pull请求都将受到欢迎。

安全问题

如何安全地使用指向堆中元素的某些指针 Gc<T>?问题有两个部分

  • 确保 Gc<T> 不会超出或被用于超出堆的生命周期
  • ABA问题(我们如何知道我们想要的对象没有被垃圾回收,我们现在指向的是同一位置的不同对象)
    • 我们必须要么推迟对象回收,直到没有对其的引用,要么在堆内容发生变化时有一种区分对象的方法。推迟回收实际上并不是一个选项,因为这需要跟踪剩余的数量,这会阻止指针实现 Copy

碎片整理

为了使碎片整理成为可能,需要一个间接指针。对象持有指向不动的引用表的指针,该引用表包含指向活动对象的指针。在碎片整理时,引用表被更新以反映对象的新位置。唯一的替代方案是找到并更新所有引用指针或使用一个索引系统,该系统在访问时动态解析对象的位置。

ABA

为了解决ABA问题,我们只能利用有限的选项。由于我们无法在保持Copy指针的同时确定是否需要延期回收,因此延期回收不可行。我们唯一的选择是提供一种区分对象的方法。这使我们可以选择使用标记状态。实际上,标签可能以生成计数器的形式存在。指针和对象都需要存储这个标签。然而,标签的放置可能会很棘手,因为根据分配方法,回收对象的指针可能会对齐到堆中现在使用该部分的空间。如果我们想使用直接对象指针,我们需要确定标签的偏移量。这意味着我们需要使用多个固定大小的对象堆,以便无论gc状态如何,标签始终是一个固定偏移量从对象指针。另一种方法是使用间接指针。参考表可以扩展以包含对象标签和数据指针。这不会限制数据在堆中的放置方式,也不会增加堆对象的大小。

依赖项

~125KB