14 个不稳定版本 (4 个破坏性更新)
0.5.3 | 2024年5月15日 |
---|---|
0.5.1 | 2024年4月22日 |
0.5.0 | 2024年1月1日 |
0.4.0 | 2023年10月30日 |
0.1.1 | 2019年5月11日 |
#45 在 #收集 中
每月下载量 4,701
用于 11 个crate(直接使用2个)
19KB
212 行
此仓库包含 gc-arena
crate,它为Rust提供了垃圾回收区域以及与之安全交互的方法。
gc-arena
gc-arena
crate及其辅助crate gc-arena-derive
提供了在封闭“区域”内的安全分配和具有循环检测的垃圾回收。该系统基于两种技术,使其成为可靠的系统
-
使用
Collect
trait 跟踪垃圾收集对象,该trait必须正确实现以确保找到所有可到达的对象。因此,此trait是unsafe
,但可以通过过程宏安全实现,而gc-arena-derive
正提供了这样的安全过程宏。 -
为了进行垃圾回收,垃圾收集器必须首先有一个“根”对象的列表,这些对象是已知可访问的。在我们的情况下,
gc-arena
的用户为竞技场选择一个根对象,但这不足以进行安全的垃圾回收。如果在Rust堆栈上的任何地方都有垃圾收集指针,那么这些指针也需要被视为“根”对象,以防止内存不安全。为了解决这个问题,gc-arena
通过严格限制垃圾收集指针的存储位置以及它们可以存在的时间。竞技场只能通过一个mutate
方法访问,该方法接受一个回调,并且在这个回调内部的所有垃圾收集指针都被赋予了唯一的、不变的生命周期。因此,当在mutate
方法之外时,Rust借用检查器确保垃圾收集指针不可能在堆栈上的任何地方存活,也不可能被走私到竞技场的根对象之外。由于所有指针都可以从单个根对象被证明是可访问的,因此可以进行安全的垃圾回收。
换句话说,gc-arena
这个crate并不是将Rust修改为具有全局访问权限的垃圾收集器,而是仅允许在孤立的垃圾收集竞技场中进行有限的垃圾回收。所有垃圾收集指针必须永远只在这个竞技场内存活,并且来自不同竞技场的指针被防止存储在错误的竞技场中。
用例
这个crate最初是作为在安全的Rust中编写垃圾收集语言虚拟机的一种手段开发的,但可能还有许多其他用途。
当前状态和待办事项
基本可用且安全!它被Adobe Flash Player模拟器Ruffle用于其ActionScript虚拟机以及一些其他项目(如我的无堆栈Lua运行时piccolo,该crate最初是为它设计的)
收集算法是一个增量标记和清除算法,与PUC-Rio Lua中的算法非常相似,并且主要优化了低暂停时间。在突变期间,累积了分配“债务”,而这个“债务”决定了下一次调用Arena::collect
将要执行的工作量。
竞技场中持有的指针(拼写为Gc<'gc, T>
)是零成本的原始指针。它们实现了Copy
,并且是指针大小,在突变期间不进行任何簿记。
一些当前的限制
-
由于Rust的限制,分配DST(数据结构类型)目前有些痛苦。可以有指向DST的
Gc
指针,并且有替代不稳定Unsize
强制转换,但没有直接分配任意大小DST的支持。 -
没有任何多线程分配和收集的支持。这里的基本生命周期和安全技术仍然适用于支持多线程的竞技场,但这个crate不支持这一点。它针对单线程使用和多个独立竞技场进行了优化。
-
Collect
特质不提供一旦对象分配后移动对象的机制,因此这限制了可以编写的收集器的类型。这是可以实现的,但还没有在这方面开展工作。 -
这个crate目前缺乏文档和示例。
现有技术
这里的大多数想法都不是我的,大部分设计都是从rust-gc中大量借鉴的,而“生成性”这个想法来源于没有 Rust 就无法拼写出信任。
许可证
本仓库中的所有内容均受以下任一许可证的许可:
- MIT 许可证 LICENSE-MIT 或 http://opensource.org/licenses/MIT
- Creative Commons CC0 1.0 无限制公共领域贡献 LICENSE-CC0 或 https://creativecommons.org/publicdomain/zero/1.0/
任由您选择。
依赖关系
~0.4–0.8MB
~18K SLoC