#垃圾回收 #垃圾 #清扫 #收集 #标记 #gc

broom

一个支持标记清除垃圾回收的舒适式跟踪垃圾收集器

7个版本

0.3.2 2022年10月23日
0.3.1 2022年10月22日
0.3.0 2020年3月24日
0.2.0 2020年3月23日
0.1.3 2020年3月23日

内存管理 中排名 #391

每月下载量 36

Apache-2.0/MIT

25KB
400

Broom

一个支持标记清除垃圾回收的舒适式跟踪垃圾收集器。

Cargo Documentation License

特性

  • 舒适式API
  • 标记和清扫堆清理
  • 尽管有循环,也能轻松(且安全)地修改堆值
  • 通过句柄以零成本访问堆对象

示例

use broom::prelude::*;

// The type you want the heap to contain
pub enum Object {
    Num(f64),
    List(Vec<Handle<Self>>),
}

// Tell the garbage collector how to explore a graph of this object
impl Trace<Self> for Object {
    fn trace(&self, tracer: &mut Tracer<Self>) {
        match self {
            Object::Num(_) => {},
            Object::List(objects) => objects.trace(tracer),
        }
    }
}

// Create a new heap
let mut heap = Heap::default();

// Temporary objects are cheaper than rooted objects, but don't survive heap cleans
let a = heap.insert_temp(Object::Num(42.0));
let b = heap.insert_temp(Object::Num(1337.0));

// Turn the numbers into a rooted list
let c = heap.insert(Object::List(vec![a, b]));

// Change one of the numbers - this is safe, even if the object is self-referential!
*heap.get_mut(a).unwrap() = Object::Num(256.0);

// Create another number object
let d = heap.insert_temp(Object::Num(0.0));

// Clean up unused heap objects
heap.clean();

// a, b and c are all kept alive because c is rooted and a and b are its children
assert!(heap.contains(a));
assert!(heap.contains(b));
assert!(heap.contains(c));

// Because `d` was temporary and unused, it did not survive the heap clean
assert!(!heap.contains(d));

此Crate适用于谁

  • 在Rust中编写动态类型语言且希望有一个简单、可靠的垃圾收集器的人
  • 希望拥有复杂图数据结构且具有修改和循环但不想有内存泄漏的人

此Crate不适用于谁

  • 在编写普通Rust代码时希望有垃圾收集器的人

性能

此Crate不针对性能做出具体承诺。它采用“最佳尝试”方法;这意味着它应该足够快以适用于大多数目的,但可能不会与投入多年开发工作的垃圾收集器相竞争。

待办事项

如果我有时间,我想用 broom 做一些事情

  • 比标记清除更智能的清理策略
  • 部分清理以防止垃圾回收延迟峰值

如果你对从事这些事情中的任何一项感兴趣,请随时发起一个pull请求!

许可证

Broom受以下任一许可证的许可

依赖项

~1MB
~18K SLoC