给不需要 GC 的语言写一个垃圾回收器:Rust 里的 dumpster
来源:claytonwramsey.com — 2026-10-19
📋 概述
Rc 和 Arc 都是引用计数,碰到循环引用就永久泄漏——一个结构体用 OnceCell 存住自己的 Rc 就够了。作者于是用 Rust 写了一个能处理循环的 Gc 容器,API 尽量贴近 Rc/Arc,并以 dumpster 的名字发布到 crates.io。可用的武器只有 Drop 和自定义 trait,而障碍是三重:Rust 无法感知值被移动、作者坚持支持 ?Sized 类型、泛型单态化之后运行期没有任何类型信息。
🔑 核心要点
- 循环引用的最小复现只要三行:OnceCell 里存一份指向自身的 Rc,这块内存就永远回收不掉
- 方案要求容器内类型实现 Collectable trait,代价是 dumpster 上游的库没法替自己的类型实现它
- 最硬的限制是移动不可检测:没有 OnMove 这样的钩子,值被搬进另一个 Gc 时无法得知它已经不再被根持有
- 支持 ?Sized 让 Gc<[T]> 之类可用,但和类型擦除叠加后,追踪对象内部指针变得格外麻烦
- 作者自评:虽然语言处处与 GC 为敌,最终实现「妥协相对较少」
💡 金句
If carcinization happens when languages evolve to be more like Rust, then what do you call it when Rust evolves to be more like Java? Caffeination?
👍 0
👎 0
← 返回 Lobsters 首页