Go - 使用 sync.Pool 来减少 GC 压力

简介: Go - 使用 sync.Pool 来减少 GC 压力

文章目录:

  • 前言
  • sync.Pool
  • 小结
  • 推荐阅读


前言

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

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

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

小结

  1. 一定要注意存储的是临时对象!
  2. 一定要注意 Get 后,要调用 Put

以上,希望对你能够有所帮助。

推荐阅读

目录
相关文章
|
11月前
|
算法 Java Go
Go语言GC:吞吐量和延迟的博弈
Go语言GC:吞吐量和延迟的博弈
105 0
|
28天前
|
存储 缓存 安全
go sync.Pool 设计与实现
go sync.Pool 设计与实现
23 2
|
16天前
|
存储 Java 关系型数据库
听说过对 Go map 做 GC 吗?
听说过对 Go map 做 GC 吗?
|
4月前
|
存储 缓存 安全
Golang深入浅出之-Go语言中的并发安全容器:sync.Map与sync.Pool
Go语言中的`sync.Map`和`sync.Pool`是并发安全的容器。`sync.Map`提供并发安全的键值对存储,适合快速读取和少写入的情况。注意不要直接遍历Map,应使用`Range`方法。`sync.Pool`是对象池,用于缓存可重用对象,减少内存分配。使用时需注意对象生命周期管理和容量控制。在多goroutine环境下,这两个容器能提高性能和稳定性,但需根据场景谨慎使用,避免不当操作导致的问题。
124 7
|
4月前
|
存储 算法 Java
Go语言GC(垃圾回收)的工作原理
【2月更文挑战第23天】
122 0
|
4月前
|
算法 Java Go
Go语言GC:详解GC的五个阶段
【2月更文挑战第20天】
156 0
|
Java Go 调度
Go语言核心手册-12.sync.Pool
pool在掌握基础用法的同时,需要知道Get和Push方法的实现逻辑,其中最重要的一点,是需要将pool和GMP的调度原理结合起来,其中两者的P的原理其实是一样的,只是对于资源抢占这一块,GMP抢占的是G,pool抢占的是pool数据,对于这块,其实是自己个人的理解,如果理解的不对,还请大家帮忙指出。
160 0
Go语言核心手册-12.sync.Pool
|
存储 JSON 安全
Go 语言中的 sync.Pool 使用
Go 语言中的 sync.Pool 使用
243 0
|
存储 缓存 Rust
Go并不需要Java风格的GC
像Go、Julia和Rust这样的现代语言不需要像Java c#所使用的那样复杂的垃圾收集器。但这是为什么呢?
Go并不需要Java风格的GC