sync.Pool原理
sync.Pool原理
sync.Pool - 临时对象池
概述
是一个临时对象缓存池,核心目的是减少对象频繁创建和释放带来的 GC 压力。
原理
1、每个 P 持有一个私有池(private),还有一个共享池(shared)
1
2
3
4
type ProcessorPool struct {
private any // 私有对象(无锁)
shared poolChain // 共享链表(可被其他 P steal)
}
- 优先从 private 获取对象,如果 private 没有,则从其他 P 的 shared 获取
- private 不需要加锁,shared 需要加锁
2、2 轮 GC 清空对象机制
1
2
3
4
5
type Pool struct {
local unsafe.Pointer // 一轮 GC
victim unsafe.Pointer // 二轮 GC
New func() any
}
- 第一轮 GC 将 local 中的对象移到 victim 中
- 第二轮 GC 将 victim 中的对象清空
使用场景
- 高频创建:关键看对象创建是否增加 GC CPU 占比( > 15%)。而不是只看创建频率。
经验值:QPS ≥ 5万/s; 对象 ≥ 256B;
- 短生命周期:小于 2 轮 GC 时间。
经验值:生命周期 < 1s
- 无状态:不适用连接池等。
不适用批处理系统,应该批处理系统对象生命周期(30s)大于 2 轮 GC 时间。参考GC 优化方式
This post is licensed under CC BY 4.0 by the author.