type mheap struct {
lock mutex // 是公有的,需要加锁
free [_MaxMHeapList]mSpanList // 未分配的spanlist,比如free[3]是由包含3个 page 的 mspan 组成的链表
freelarge mTreap // mspan组成的链表,每个mspan的 page 个数大于_MaxMHeapList
busy [_MaxMHeapList]mSpanList // busy lists of large spans of given length
busylarge mSpanList // busy lists of large spans length >= _MaxMHeapList
allspans []*mspan // 所有申请过的 mspan 都会记录在 allspans
spans []*mspan // 记录 arena 区域页号(page number)和 mspan 的映射关系
arena_start uintptr // arena是Go中用于分配内存的连续虚拟地址区域,这是该区域开始的指针。也是将要分配给应用程序使用的空间
arena_used uintptr // 已经使用的内存的指针
arena_alloc uintptr
arena_end uintptr
//arenas数组集合,一个二维数组
arenas [1 << arenaL1Bits]*[1 << arenaL2Bits]*heapArena
//各个规格的mcentral集合
central [numSpanClasses]struct {
mcentral mcentral
pad [sys.CacheLineSize - unsafe.Sizeof(mcentral{})%sys.CacheLineSize]byte //避免伪共享(false sharing)问题
}
spanalloc fixalloc // allocator for span*
cachealloc fixalloc // mcache分配器
}
对于runtime.mheap
需要关注central和arenas。central是各个规格的mcentral集合,在初始化的时候会通过遍历class_to_size来进行创建;arenas是一个二维数组,用来管理内存空间。arenas由多个runtime.heapArena
组成,每个单元都会管理 64MB 的内存空间。