一个小技巧,巧妙的使用 sync.Pool 减少 GC 压力,提升性能!

Go 语言的 sync.Pool 本质是用来保存和复用临时对象,以减少内存分配,降低 GC 压力,比如需要使用一个对象,就去 Pool 里面拿,如果拿不到就分配一份,这比起不停生成新的对象,用完了再等待 GC 回收要高效的多。

sync.Pool 是临时对象池,存储的是临时对象,不可以用它来存储 socket 长连接和数据库连接池等。

sync.Pool 小案例

sync.Pool 的使用很简单,看下示例代码:

package student

import (
 "sync"
)

type student struct {
 Name string
 Age  int
}

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 里面的对象具体是什么时候真正释放?这个是由系统决定的。

c466099764571132a0d4ac4a0372ac43.jpeg

26332e32c90a40363b84adab3703b6b1.png

cac1de019e8092ffbe9516821774dc2d.jpeg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值