go内存模型及工具
Posted better_hui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go内存模型及工具相关的知识,希望对你有一定的参考价值。
目录
内存结构
go程序启动时,会像系统申请一块连续的虚拟内存结构,并划分为如下结构:
arena
arena区块是死去模型中的堆区 , 他被划分为page ,每页8k .
bitmap
bitmap区域标识了arena区域哪些地址保存了对象,并使用4bit标识对象是否包含指针、GC标记信息。
bitmap一个byte(8个bit) ,可以标识arena区4个指针的内存。因此bitmap的大小是512 / ( 4 * 8b) = 16G
spans
spans中保存的是mspan的指针,每个指针对应一页。
mspan
mspan是go中内存管理的基本单元,是一片连续的8kb的页组成的大块内存。
mspan的数据结构包含了也的起始地址,mspan是一个双端队列
mspan与Object的关系
1、mspan根据自身的sizeClass来分割若干object,一个object可以存储一个对象。
2、在为对象分配内存时,会分配一个和object大小相对的对象
内存管理组件
mcache
go为每一个逻辑处理器P提供了一个本地的内存缓存即mcache ,每一个p同一时间只能运行一个g , 因此,对于mcache是go程安全的,是无锁的。
我们来看下mcache的具体结构
mcentral
mcache内有空闲内存时,向mcentral申请,并缓存起来。
前面我们说 spans 是 mspan的集合 , 而且分为67种大小的不通规格 , mcentral 是保存了一种特定规格的全区mspan列表。为mcache提供切分好的mspan.
每一个mcentral都包含了两个span列表 : 已经被分配出去的 、尚未被分配出去的。
mcentral是所有逻辑处理器共享的,所以 重要的事情说三遍:有锁、有锁、有锁。
mheap
当mcentral内有空闲内存时,则向mheap申请。mheap持有go程序的整个堆空间,mheap是全局唯一的。
当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内存模型及工具的主要内容,如果未能解决你的问题,请参考以下文章