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 日

#31内存管理

Download history 851/week @ 2024-05-03 1345/week @ 2024-05-10 1150/week @ 2024-05-17 989/week @ 2024-05-24 1123/week @ 2024-05-31 1350/week @ 2024-06-07 1149/week @ 2024-06-14 995/week @ 2024-06-21 837/week @ 2024-06-28 808/week @ 2024-07-05 1351/week @ 2024-07-12 1113/week @ 2024-07-19 994/week @ 2024-07-26 1657/week @ 2024-08-02 1393/week @ 2024-08-09 1154/week @ 2024-08-16

5,355 每月下载量
用于 12 个 Crates (6 个直接使用)

MIT 许可证

130KB
2.5K SLoC

crates.io docs.rs Build Status

该仓库是 gc-arena crate 的家,该 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 中借鉴的,而使用“生成性”的想法来自 You can't spell trust without Rust

许可证

本存储库中的所有内容均许可以下任一许可:

由您选择。

依赖项

~0.4–1.2MB
~22K SLoC