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 在 内存管理
42KB
850 行
gc_api
基于特质的Rust通用垃圾回收器API。此项目目前存在是为了制定此类API可能的外观,同时支持广泛的垃圾回收器类型/实现。
此crate仍在开发中。任何反馈或pull请求都将受到欢迎。
安全问题
如何安全地使用指向堆中元素的某些指针 Gc<T>
?问题有两个部分
- 确保
Gc<T>
不会超出或被用于超出堆的生命周期 - ABA问题(我们如何知道我们想要的对象没有被垃圾回收,我们现在指向的是同一位置的不同对象)
- 我们必须要么推迟对象回收,直到没有对其的引用,要么在堆内容发生变化时有一种区分对象的方法。推迟回收实际上并不是一个选项,因为这需要跟踪剩余的数量,这会阻止指针实现
Copy
。
- 我们必须要么推迟对象回收,直到没有对其的引用,要么在堆内容发生变化时有一种区分对象的方法。推迟回收实际上并不是一个选项,因为这需要跟踪剩余的数量,这会阻止指针实现
碎片整理
为了使碎片整理成为可能,需要一个间接指针。对象持有指向不动的引用表的指针,该引用表包含指向活动对象的指针。在碎片整理时,引用表被更新以反映对象的新位置。唯一的替代方案是找到并更新所有引用指针或使用一个索引系统,该系统在访问时动态解析对象的位置。
ABA
为了解决ABA问题,我们只能利用有限的选项。由于我们无法在保持Copy
指针的同时确定是否需要延期回收,因此延期回收不可行。我们唯一的选择是提供一种区分对象的方法。这使我们可以选择使用标记状态。实际上,标签可能以生成计数器的形式存在。指针和对象都需要存储这个标签。然而,标签的放置可能会很棘手,因为根据分配方法,回收对象的指针可能会对齐到堆中现在使用该部分的空间。如果我们想使用直接对象指针,我们需要确定标签的偏移量。这意味着我们需要使用多个固定大小的对象堆,以便无论gc状态如何,标签始终是一个固定偏移量从对象指针。另一种方法是使用间接指针。参考表可以扩展以包含对象标签和数据指针。这不会限制数据在堆中的放置方式,也不会增加堆对象的大小。
依赖项
~125KB