Hasty Briefsbeta

双语

Understanding the Go Runtime: The Memory Allocator

3 months ago
  • #memory-management
  • #go-runtime
  • #performance
  • Go运行时的内存分配器通过避免频繁的操作系统调用来高效管理堆内存。
  • 当数据需要比创建它的函数存活更久时(通过逃逸分析确定),内存分配会在堆上进行。
  • 分配器采用三级层次结构(mcache、mcentral、mheap)来最小化并发分配时的锁竞争。
  • 预先从操作系统申请64MB的大块内存(arena),划分为8KB的页,再细分为固定大小对象的span。
  • span按68种大小规格(8B到32KB)分类,每个span仅存储单一尺寸对象以减少碎片。
  • 微小对象(<16B)会被合并存储,大对象(>32KB)则绕过层级直接由mheap处理。
  • 垃圾回收器与分配器协作,使用位图(allocBits和gcmarkBits)追踪存活和释放的对象。
  • 清理器定期将未使用的内存返还操作系统,在性能和资源效率间取得平衡。