专栏首页Go实战golang之runtime.SetFinalizer

golang之runtime.SetFinalizer

在实际的编程中,我们都希望每个对象释放时执行一个方法,在该方法内执行一些计数、释放或特定的要求,以往都是在对象指针置nil前调用一个特定的方法,golang提供了runtime.SetFinalizer函数,当GC准备释放对象时,会回调该函数指定的方法,非常方便和有效。

不过值得注意的是,指针构成的 "循环引⽤" 加上 runtime.SetFinalizer 会导致内存泄露。

type Data struct {
    d   [1024 * 100]byte
    o   *Data
}
func test() {
    var a, b Data
    a.o = &b
    b.o = &a
    runtime.SetFinalizer(&a, func(d *Data) { fmt.Printf("a %p final.\n", d) })
    runtime.SetFinalizer(&b, func(d *Data) { fmt.Printf("b %p final.\n", d) })
}
func main() {
    for {
        test()
        time.Sleep(time.Millisecond)
    }
}

输出:

$ go build -gcflags "-N -l" && GODEBUG="gctrace=1" ./test
gc11(1): 2+0+0 ms, 104 -> 104 MB 1127 -> 1127 (1180-53) objects
gc12(1): 4+0+0 ms, 208 -> 208 MB 2151 -> 2151 (2226-75) objects
gc13(1): 8+0+1 ms, 416 -> 416 MB 4198 -> 4198 (4307-109) objects

垃圾回收器能正确处理 "指针循环引⽤",但⽆法确定 Finalizer 依赖次序,也就⽆法调⽤ Finalizer 函数,这会导致目标对象⽆法变成不可达状态,其所占⽤内存⽆法被回收。

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用git-flow来帮助管理git代码 转

    对git不熟悉的我,经常把git提交搞得很乱,导致在master上有许多无用的commit,最终决定好好地看一下git的使用教程,却不小心发现了还有一个git-...

    henrylee2cn
  • [Go小技巧] 实现Go经典的消息队列处理协程

    (adsbygoogle = window.adsbygoogle || []).push({});

    henrylee2cn
  • ETCD:从应用场景到实现原理的全方位解读 转

    随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在...

    henrylee2cn
  • JS监听页面关闭

    JS可以监听浏览器页面的关闭,主要使用了window对象的onbeforeunload方法

    书童小二
  • 我所理解的零次学习

    导语:这篇zero-shot learning(ZSL)的入门性的文章,目的是为了帮助完全没有接触过这方面,并有些兴趣的同学,能在较短的时间对ZSL有一定的认识...

    AI科技大本营
  • SAP Kyma上kyma-system命名空间下面的所有service

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)

    Jerry Wang
  • *oulapp的双向证书破解

    这个最简单的方法就是使用JustTrustMe,当然这个要依赖Xposed,手机没有root的话,你也可以使用太极、 VirtualXposed 等一些免roo...

    andrew_a
  • 技术的热门度曲线

    全球最大的 IT 咨询公司高德纳(Gartner),有一个"技术热门度曲线"模型(Gartner Hype Cycle)。 该模型认为,一门技术的发展要经历五个...

    ruanyf
  • 搞它!!!Linux--深入介绍firewalld防火墙管理工具

    firewall-cmd是firewalld防火墙自带的字符管理工具,可以用来设置firewalld防火墙的各种规则

    不吃小白菜
  • 一文带你彻底厘清 Kubernetes 中的证书工作机制

    本文试图以一种比官方文档更容易理解的方式来说明 Kubernetes 和证书(Certificate)相关的工作机制,如果你也存在这方面的疑惑,希望这篇文章对你...

    张琳兮

扫码关注云+社区

领取腾讯云代金券