本文基于Go源码版本1.16、64位Linux平台、1Page=8KB、本文的内存特指虚拟内存
明天咱们开始进入《Go语言轻松进阶》系列第二章「内存与垃圾回收」第二局部「Go语言内存治理」。
对于「内存与垃圾回收」章节,会从如下三大部分开展:
-
读前常识储备(已完结)
- 指针的大小
- 内存的线性调配
- 什么是FreeList?
- 虚拟内存
- TCMalloc内存调配原理
- Go语言内存治理(以后局部)
- Go语言垃圾回收原理(未开始)
第一局部「读前常识储备」曾经完结,为了更好了解本文大家能够点击历史链接进行查看或温习。
目录对于解说「Go语言内存治理」局部我的思路如下:
mspanpagemspanobjectsizeclassspanclassheaparenachunk
通过这个思路拆解的目录:
mcachemcentralmheapmcachepmmspanpagemspanobjectsizeclassspanclassheaparenachunk
Go内存治理架构
TCMallocTCMalloc
TCMalloc
TCMalloc
TCMalloc
在多核以及超线程时代的明天,多线程技术曾经被宽泛使用到了各个编程语言中。当应用多线程技术时,因为多线程共享内存,线程申在请内存(虚拟内存)时,因为并行问题会产生竞争不平安。
TCMalloc
TCMalloc
TCMallocThread Cache Memory alloc
TCMalloc
TCMalloc
TCMalloc
ThreadCacheCentralFreeListPageHeap
TCMalloc
TCMalloc
- 小对象 <= 256 KB
- 大对象 > 256 KB
咱们这里以调配小对象为例,当给小对象分配内存时:
ThreadCacheThreadCacheSizeClassCentralFreeListSizeClassPageHeap
Go内存分配器的逻辑架构
TCMalloc
mcachemcentralmheap
<p align=”center”>
<img src=”http://cdn.tigerb.cn/20220405133623.png” style=”width:60%”>
</p>
centralmcentral
mcachepm
咱们更新下架构图如下:
「Go内存分配器」把申请的内存对象按大小分为了三类:
- 微对象 0 < Micro Object < 16B
- 小对象 16B =< Small Object <= 32KB
- 大对象 32KB < Large Object
为了清晰看出这三层的关系,这里以堆上调配小对象为例:
mcachecentralmheap
<p align=”center”>
<img src=”http://cdn.tigerb.cn/20220405224348.png” style=”width:80%”>
</p>
TCMalloc
最初咱们总结下:
TCMallocmcachemcentralmheapmcachepm
链接 http://tigerb.cn/go/#/kernal/