go内存模型及工具

目录

 

内存结构

arena

bitmap

spans

mspan

内存管理组件

          mcache

mcentral

mheap

Go内存分配流程总结:

对象分三种:

申请流程:


 

 

内存结构

go程序启动时,会像系统申请一块连续的虚拟内存结构,并划分为如下结构:

 

arena

arena区块是死去模型中的堆区 , 他被划分为page ,每页8k .

bitmap

bitmap区域标识了arena区域哪些地址保存了对象,并使用4bit标识对象是否包含指针、GC标记信息。

bitmap一个byte(8个bit) ,可以标识arena区4个指针的内存。因此bitmap的大小是512 / ( 4 * 8b) = 16G

img

img

spans

spans中保存的是mspan的指针,每个指针对应一页。

 

img

 

mspan

mspan是go中内存管理的基本单元,是一片连续的8kb的页组成的大块内存。

mspan的数据结构包含了也的起始地址,mspan是一个双端队列

mspan与Object的关系

1、mspan根据自身的sizeClass来分割若干object,一个object可以存储一个对象。

2、在为对象分配内存时,会分配一个和object大小相对的对象

img

 

内存管理组件

mcache

go为每一个逻辑处理器P提供了一个本地的内存缓存即mcache ,每一个p同一时间只能运行一个g , 因此,对于mcache是go程安全的,是无锁的。

我们来看下mcache的具体结构

img

 

 

 

mcentral

mcache内有空闲内存时,向mcentral申请,并缓存起来。

前面我们说 spans 是 mspan的集合 , 而且分为67种大小的不通规格 , mcentral 是保存了一种特定规格的全区mspan列表。为mcache提供切分好的mspan.

 

img

 

每一个mcentral都包含了两个span列表 : 已经被分配出去的 、尚未被分配出去的。

mcentral是所有逻辑处理器共享的,所以 重要的事情说三遍:有锁、有锁、有锁。

img

mheap

当mcentral内有空闲内存时,则向mheap申请。mheap持有go程序的整个堆空间,mheap是全局唯一的。

img

当mheap中也没有空闲内存了,则向操作系统申请。

 

Go内存分配流程总结:

对象分三种:

 

tinny allocations (size < 16bytes , no pointers)

small allocations (16bytes < size <=32k)

large allctions ( size < 32k)

 

微小对象,使用mcache的tiny分配器分配。

小对象,通过mcache正常分配

大对象,直接在mheap上分配。

 

申请流程:

1、首先计算使用的大小规格

2、找到mcache中对应大小规格的span分配。

3、如果mcache没有时,像mcentral申请,mcentral将对应规格的mspan从空闲列表移动至已分配列表

4、如果mcentral中没有,则向mheap申请。mheap

5、如果mheap中没有,则向操作系统申请。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值