简介
当向central申请内存,而central中span队列又已满时,就会向heap申请内存
结构体
先大概看看heap的结构
type mheap struct {
// 以下为sweep相关的变量
lock mutex
pages pageAlloc // page allocation data structure
sweepgen uint32 // sweep generation, see comment in mspan; written during STW
sweepdone uint32 // all spans are swept
sweepers uint32 // number of active sweepone calls
// 所有创建过的spans
allspans []*mspan // all spans out there
// 所有映射过的arena的index,可以用来找到对应的空间
allArenas []arenaIdx
// allArenas的快照,在sweep循环开始时创建,可以被GC安全地访问
sweepArenas []arenaIdx
// 每次清理都会额外清理一些pages,这些(包括释放的)会放在这个pool中
reclaimCredit uintptr
...
}
申请过程
一.根据所需span的npages和size,heap申请内存:
- 锁住当前g,防止GC捣乱
- 为了防止内存无限增长,申请之前先清理&申明至少npage张页。
- 从credit pool中拿出npage页,如果不够则申请一大块工作区(512),还不够就循环取。如果申请的多了,就将多余的放入credit pool中
二.获取span
- 尝试从mspancache缓存中获取span,没有则从pages申请npage的内存,再没有就尝试增加npages内存,还没就内存不足报错了
- 如果需要的物理内存,则申请后free掉pages附近多的内存
- 有了span后,就对其进行初始化
三.central再完成初始化
- 计算span的end地址等