Go 内存分配架构
四层结构:应用程序、mcache、mcentral、mheap 以及操作系统
应用程序
new() · make() · 字面量
mallocgc()
mcache
每个 P 独享,无锁
tiny allocator
< 16B,无指针
span 缓存列表
16B–32KB,67种规格
栈缓存
goroutine 初始栈
cache miss
mcentral
全局,按 size class 加锁
nonempty span 列表
有空闲 slot 的 span
empty span 列表
slot 已耗尽的 span
span 耗尽
mheap
全局堆,以 page(8KB)为单位
free treap
空闲 span 索引
scavenger
异步归还 OS
大对象(>32KB)
直接从这里分配
mmap()
操作系统(虚拟内存)
>32KB
跳过
缓存层