导读
本文基于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/