Go - 使用 sync.Pool 来减少 GC 压力
前言
【Go - 使用 sync.Pool 来减少 GC 压力】sync.Pool
是临时对象池,存储的是临时对象,不可以用它来存储 socket
长连接和数据库连接池等。
sync.Pool
本质是用来保存和复用临时对象,以减少内存分配,降低 GC 压力,比如需要使用一个对象,就去 Pool 里面拿,如果拿不到就分配一份,这比起不停生成新的对象,用完了再等待 GC 回收要高效的多。
sync.Pool
sync.Pool
的使用很简单,看下示例代码:
package studentimport (
"sync"
)type student struct {
Name string
Ageint
}var studentPool = &sync.Pool{
New: func() interface{} {
return new(student)
},
}func New(name string, age int) *student {
stu := studentPool.Get().(*student)
stu.Name = name
stu.Age = age
return stu
}func Release(stu *student) {
stu.Name = ""
stu.Age = 0
studentPool.Put(stu)
}
当使用
student
对象时,只需要调用 New()
方法获取对象,获取之后使用 defer
函数进行释放即可。stu := student.New("tom", 30)
defer student.Release(stu)// 业务逻辑
...
关于
sync.Pool
里面的对象具体是什么时候真正释放,是由系统决定的。小结
- 一定要注意存储的是临时对象!
- 一定要注意
Get
后,要调用Put
!
推荐阅读
- Go - 使用 options 设计模式
- Go - json.Unmarshal 遇到的小坑
- Go - 两个在开发中需注意的小点
- Go - time.RFC3339 时间格式化
推荐阅读
- 9班|9班 刘志雪
- 一个人的碎碎念
- 第326天
- 猎杀IP
- 我从来不做坏事
- 由浅入深理解AOP
- 年味真的是越来越淡了么
- 【译】20个更有效地使用谷歌搜索的技巧
- 感恩之旅第75天
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()