2 个版本
0.1.1 | 2020 年 5 月 1 日 |
---|---|
0.1.0 | 2020 年 4 月 29 日 |
#718 在 内存管理
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 使用简单,您只需为您的类型实现 Traceable
和 Finalizer
即可,现在您就有了 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