博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang之runtime.SetFinalizer
阅读量:6969 次
发布时间:2019-06-27

本文共 931 字,大约阅读时间需要 3 分钟。

hot3.png

在实际的编程中,我们都希望每个对象释放时执行一个方法,在该方法内执行一些计数、释放或特定的要求,以往都是在对象指针置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" ./testgc11(1): 2+0+0 ms, 104 -> 104 MB 1127 -> 1127 (1180-53) objectsgc12(1): 4+0+0 ms, 208 -> 208 MB 2151 -> 2151 (2226-75) objectsgc13(1): 8+0+1 ms, 416 -> 416 MB 4198 -> 4198 (4307-109) objects

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

转载于:https://my.oschina.net/henrylee2cn/blog/832518

你可能感兴趣的文章
linux服务器优化1.0版
查看>>
从oracle到mysql,主从到分库,一个普通项目数据库架构的变迁
查看>>
ASP.NET 4.0请求验证报错 从客户端...中检测到有潜在危险的 Request.Form 值
查看>>
ASM
查看>>
mysql常用操作
查看>>
unit 9 文档练习
查看>>
PHP代码优化的40条建议
查看>>
Crontab的用法
查看>>
搭建 LNMP+WordPress 环境
查看>>
Redisson官方文档 - 7. 分布式集合
查看>>
Centos6.7_KVM安装配置使用
查看>>
菜鸟学Linux 第066篇笔记 简单配置iptables
查看>>
screen
查看>>
支持免费的办公软件 IBM Symphony
查看>>
SQL Server 中函数的理解总结
查看>>
mysql5.1.X安装plugin
查看>>
Nginx+tomcat整合
查看>>
解决Vsphere Client 60天过期问题
查看>>
RDP error: This computer can’t connect to the remote computer
查看>>
Zabbix3.x安装图解教程
查看>>