go内存模型及工具

Posted better_hui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中没有,则向操作系统申请。

以上是关于go内存模型及工具的主要内容,如果未能解决你的问题,请参考以下文章

java内存模型及分块

The Go Memory Model(go 内存模型)

Go如何保证并发读写的顺序?—内存模型

Java内存模型

转jvm 内存模型及内存调优

go语言并发之MPG模型