#垃圾回收 #gc

bin+lib cgc-single-threaded

压缩垃圾回收器

2 个版本

0.1.1 2020 年 5 月 1 日
0.1.0 2020 年 4 月 29 日

#718内存管理

MIT 许可证

58KB
1.5K SLoC

cgc

cgc 是代际复制垃圾回收器。

此分支实现了单线程版本,不涉及并发和同步。

算法

cgc 使用半空间垃圾回收来保持 GC 简单,并使用代来提高 GC 延迟。

此 crate 的适用对象

  • 适用于开发编程语言运行时的人,无论语言是动态类型还是静态类型。
  • 游戏开发者,其中很多资源被加载,其中一些资源没有被自动清除。
  • 对于做大型且复杂的图结构的人,不想与引用计数打交道。
  • 对于处理巨大堆和碎片化的人,cgc 通过复制垃圾回收消除碎片化。

日志支持

cgc 支持日志。要打印分配跟踪,请将功能 trace-gc 添加到功能中,要打印 GC 时间,请添加 trace-gc-timings 功能。

与其他 GC Crates 的比较

broom

broom 的优势

  • 依赖项更少(只依赖于一个 crate hashbrown)。
  • 实现非常小且简单。

broom 的缺点

  • 标记-清除算法。标记-清除在巨大堆上可能非常慢。
  • 没有内存碎片化,也没有代。没有内存碎片化,当堆碎片化时,分配内存会非常慢,没有代,收集可能会非常慢,因为 GC 将收集整个堆。
  • 没有并发垃圾回收支持。

gc

gc 的优势

  • 无依赖项
  • 创建 GC 对象很容易,只需使用 #[derive(Trace)]

gc 的缺点

gc crate 与 broom crate 有相同的缺点,它使用标记-清除,并且没有内存碎片化。

使用方法

cgc 使用简单,您只需为您的类型实现 TraceableFinalizer 即可,现在您就有了 GC 对象!

extern crate cgc_single_threaded as cgc;

use cgc::api::*;

// Simple linked list.
#[derive(Debug)]
struct Foo(Option<Handle<Foo>>);

impl Traceable for Foo {
    fn trace_with(&self, tracer: &mut Tracer) {
        self.0.trace_with(tracer);
    }
}

impl Finalizer for Foo {
    fn finalize(&mut self) {
        println!("GCed");
    }
}

fn main() {
    let mut heap = cgc::heap::Heap::new(1024, 2048); // 1kb new space,2kb old space.
    {
        let value = heap.allocate(Foo(None));
        let value2 = heap.allocate(Foo(Some(value.to_heap())));
        println!("{:?}", value2);
    }
    heap.collect(); // value and value2 is GCed.
    
}

依赖关系

~3MB
~59K SLoC