9.5 垃圾回收、引用计数与所有权
内存管理看似是运行时话题,但编译器与运行时的协同设计决定了它的可用性、性能与安全边界。
常见三类策略:
- 追踪式(tracing)GC(如标记清除 mark-sweep 及其变体)
- 引用计数(reference counting)
- 所有权/借用模型(大量约束在编译期完成)
没有一套方案在所有负载都最优。选择取决于延迟目标、吞吐目标、对象图形态和语言语义承诺。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
追踪式与引用计数的核心取舍
追踪式 GC 从根集做可达性遍历,因此天然能回收不可达循环对象。
引用计数在对象计数归零时回收更及时,局部延迟常有优势,但纯引用计数对循环引用无能为力,需要额外机制补足。
这组取舍通常体现为:
- 暂停形态与尾延迟
- 写屏障或计数更新开销
- 元数据复杂度
- 与外部资源模型的集成方式
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
所有权/借用:把风险前移到编译期
所有权模型通过静态规则限制危险别名与可变共享。
常见核心规则可概括为:同一时刻“多读或一写”。
它的价值在于:
- 更强的释放后使用(use-after-free)预防
- 更明确的释放责任
- 更可预测的资源生命周期
代价是接口(API)设计更严格,生命周期关系需要显式表达。
工程上常见混合方案:某些资源走所有权确定性释放,对象图仍由运行时 GC 或 RC 处理。
决策视角
评估内存管理方案时,建议按四个问题落地:
- 延迟预算是多少
- 对象图是否大量出现循环
- 是否需要重度跨语言互操作
- 希望错误在编译期暴露,还是允许部分运行期检查
这些都是语言工程决策,不是单纯“算法好坏”比较。
正在加载概念检查...