From unique to cleanups and weak new low-level tools for efficiency
📌 背景与动机
在过去,Go 语言提供了 runtime.SetFinalizer 方法来处理对象被垃圾回收时的清理操作(Finalizer)。
但 Finalizer 存在一些固有问题:
- 如果对象之间有循环引用,Finalizer 可能永远不会被调用,导致内存泄漏。
- Finalizer 会延迟对象的回收,至少需要两个垃圾回收周期才能彻底清除对象。
- Finalizer 有可能让对象“复活”(Resurrection),导致原本应被释放的对象意外存活下来,造成内存浪费。
因此,Go 在 1.24 版本推出了两个新功能:
runtime.AddCleanup:更安全的对象清理方法。weak.Pointer:弱引用指针类型,可以引用对象但不会阻止对象被回收。
这两个功能结合使用,能有效解决传统 Finalizer 的问题,并构建更高效、更安全的数据结构,比如缓存或去重机制。
📌 一、runtime.AddCleanup(安全清理函数)
runtime.AddCleanup 允许给一个对象附加一个“清理函数”,当该对象变得不可达(即垃圾回收后)时,清理函数将被执行。
示例:使用内存映射文件(memory-mapped file)