#垃圾回收 #gc

nightly bin+lib pgc

垃圾收集器

8 个版本

0.3.0 2019年9月28日
0.2.5 2019年9月26日
0.1.0 2019年9月25日

#gc 中排名 53

MIT 许可证

50KB
1.5K SLoC

PGC

基于 Rust 的精确跟踪垃圾收集器,具有并行标记和标记-清除算法。

如何使用

要将 PGC 包含到您的项目中,请将以下内容添加到您的 Cargo.toml 文件中

[dependencies]
pgc = "*"

这可以像 Rc 一样使用,除了内部可变性。

放置在 GcRooted 中的类型必须实现 GcObjectSend

use pgc::*;

struct Foo {
    x: Gc<i32>,
    y: i32
}

unsafe impl GcObject for Foo {
    fn references(&self) -> Vec<Gc<dyn GcObject>> {
        let mut v: Vec<Gc<dyn GcObject>> = vec![];
        v.push(self.x);
        v
    }
}

要使用 Gc,只需调用 Gc::new

let foo = Gc::new(Foo {...});

GC 不会扫描程序栈以查找根对象,因此您需要显式添加根。

let foo = Gc::new(Foo {...});
add_root(foo);
... // do something with `foo`
remove_root(foo);
// Or use `Rooted` struct that will unroot object automatically:
let foo = Rooted:new(Foo {...});

问题

  • 当前的收集算法不是完全线程安全的,对于在多个线程中收集对象,我们应该提供一些平台相关的代码以暂停线程(停止世界) 停止世界机制似乎工作正常。
  • 不是完全增量。标记可以并行进行,但如果你想要标记小块内存,你应该在代码中调用 gc_mark
  • 由于 Rust 动态分派不完全允许将某些随机指针转换为 trait 对象,因此 GC 不能正确地扫描程序栈中的对象,因此您应该显式地根化和去根对象。

依赖项

~3.5MB
~59K SLoC