mheap

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 的内存空间。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注