加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang之runtime.SetFinalizer

发布时间:2020-12-16 18:19:57 所属栏目:大数据 来源:网络整理
导读:在实际的编程中,我们都希望每个对象释放时执行一个方法,在该方法内执行一些计数、释放或特定的要求,以往都是在对象指针置nil前调用一个特定的方法,golang提供了runtime.SetFinalizer函数,当GC准备释放对象时,会回调该函数指定的方法,非常方便和有效。

在实际的编程中,我们都希望每个对象释放时执行一个方法,在该方法内执行一些计数、释放或特定的要求,以往都是在对象指针置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 函数,这会导致目标对象?法变成不可达状态,其所占?内存?法被回收。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读