Post

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.