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#收集

Download history 1254/week @ 2024-04-17 787/week @ 2024-04-24 942/week @ 2024-05-01 1022/week @ 2024-05-08 1466/week @ 2024-05-15 918/week @ 2024-05-22 1128/week @ 2024-05-29 1139/week @ 2024-06-05 1349/week @ 2024-06-12 1022/week @ 2024-06-19 927/week @ 2024-06-26 845/week @ 2024-07-03 1267/week @ 2024-07-10 1118/week @ 2024-07-17 1003/week @ 2024-07-24 1225/week @ 2024-07-31

每月下载量 4,701
用于 11 个crate(直接使用2个)

MIT 许可证

19KB
212

crates.io docs.rs Build Status

此仓库包含 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 就无法拼写出信任

许可证

本仓库中的所有内容均受以下任一许可证的许可:

任由您选择。

依赖关系

~0.4–0.8MB
~18K SLoC