#垃圾收集 #引用计数 #垃圾 #循环 #rc #gc #shared-ptr

jrsonnet-gcmodule

受CPython的gc实现启发的循环垃圾收集

5个版本

0.3.7 2024年5月28日
0.3.6 2023年7月27日
0.3.5 2023年1月22日
0.3.4 2022年6月5日
0.3.3 2022年6月5日

51 in 内存管理

Download history 1335/week @ 2024-05-01 1544/week @ 2024-05-08 1768/week @ 2024-05-15 2507/week @ 2024-05-22 1803/week @ 2024-05-29 1012/week @ 2024-06-05 1310/week @ 2024-06-12 930/week @ 2024-06-19 742/week @ 2024-06-26 592/week @ 2024-07-03 647/week @ 2024-07-10 1089/week @ 2024-07-17 735/week @ 2024-07-24 608/week @ 2024-07-31 673/week @ 2024-08-07 835/week @ 2024-08-14

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

MIT 许可证

120KB
2.5K SLoC

jrsonnet-gcmodule

Documentation crates.io Build Status

这是对https://github.com/quark-zju/gcmodule包的分支,它为jrsonnet实现了一些功能

CPython实现启发的垃圾收集。

该库提供了一个类型 Cc<T>。它提供了一个类似于stdlib Rc<T>的共享引用计数指针。与Rc不同,Cc中的引用循环可以被收集。

如果所有值都可以通过引用计数来释放,则该库使用的收集器不占用额外内存。这与一些其他实现不同,这些实现需要手动收集以释放收集器使用的额外内存。

示例

use gcmodule::{Cc, Trace};
use std::cell::RefCell;

type List = Cc<RefCell<Vec<Box<dyn Trace>>>>;
let a: List = Default::default();
let b: List = Default::default();
a.borrow_mut().push(Box::new(b.clone()));
b.borrow_mut().push(Box::new(a.clone())); // Form a cycle.
drop(a);
drop(b); // Internal values are not dropped due to the cycle.
gcmodule::collect_thread_cycles(); // Internal values are dropped.

对于自定义结构,它们需要实现Trace接口。这可以通过#[derive(Trace)]来完成。

use gcmodule::{Cc, Trace};
use std::cell::RefCell;

#[derive(Trace, Default)]
struct List(RefCell<Vec<Box<dyn Trace>>>);
{
    let a: List = Default::default();
    let b: List = Default::default();
    a.borrow_mut().push(Box::new(b.clone()));
    b.borrow_mut().push(Box::new(a.clone()));
}
assert_eq!(gcmodule::collect_thread_cycles(), 2); // 2 values are collected.

有关更多示例和技术细节,请参阅文档

类似项目

bacon-rajan-cc v0.3

  • 两者都是引用计数,具有循环垃圾收集。
  • 两者主要都是单线程的,并且停止世界。
  • 主API如Cc<T>Trace相似,甚至兼容。
  • 《gcmodule》从概念上讲更简单。不需要“颜色”这一概念。
  • 《gcmodule》为多线程环境提供了 ThreadedCc<T>
  • bacon-rajan-cc即使在引用计数逻辑上下降到0时,也需要手动收集以释放GC元数据(但不包括被追踪的对象)。有关详细信息,请参阅此提交信息

rcgc v0.1

  • rcgc采用了一种新颖的方法 - 收集器保持强引用,而其他地方则使用弱引用。
  • 因此,即使对象的引用计数(逻辑上)下降到0,rcgc也需要手动收集以释放实际对象。

依赖关系

~0–5MB