go 内存管理-从TCMalloc到go内存管理

news/2024/7/20 13:43:29 标签: golang, TCmalloc, 内存管理

TCMalloc

概念

  • 页(Page) : 页是由连续的物理地址所组成的固定大小的内存块
  • Span : 它是由一系列连续的页所组成的固定大小的区域
  • ThreadCache : 每个线程的cache,每个cache包含多个链表,每个链表的内存块大小相同,相当于给内存块大小分类
  • CentralCache : 所有线程的共享的cache,cache包含链表数量和Threadcache一致,当ThreadCache的内存块不足时,可以从CentralCache获取内存块
  • PageHeap堆内存的抽象,PageHeap存的也是若干链表,CentralCache的内存不足时,会从PageHeap获取空闲的内存Span,当CentralCache的内存过多时,会把空闲的内存块放回PageHeap中。

分配过程

TCMalloc 把对象分为3种,小对象大小:0256KB,中对象大小:2571MB
,大对象大小:>1MB

小对象分配顺序:

ThreadCache -> CentralCache -> HeapPage

中对象分配顺序:

直接在PageHeap选择

大对象分配:

从large span set选择合适数量的页面组成span

Go内存管理

概念

  • Page : 与TCMalloc一致
  • Span : 与TCMalloc一致
  • mcache : 类似于ThreadCache
  • mcentral:与TCMalloc中的CentralCache类似,但mcentral中每个级别的span会存两个链表,一个用来存放包含指针的对象,一个用来存放不包含指针的对象
  • mheap : mheap与TCMalloc中的PageHeap类似, 但mheap是用树结构存储,TCMlloc中使用链表,里面保存两个二叉排序树,以span的页的数量排序,一个是free,保存span空闲并且非垃圾回收的span,一个是scav,保存是空闲并且已经垃圾回收的span
  • object size : 申请内存的对象大小
  • size class : 它是size的级别
  • span class : 指span的级别
  • num of page :简称npage,Page的数量

内存分配

GO中把对象分为小对象和大对象(>32KB),而小对象分为tiny对象(1Byte~16Byte),和其他小对象

小对象 内存分配:

寻找span的流程如下:

  1. 计算对象所需内存大小size
  2. 根据size到size class映射,计算出所需的size class
  3. 根据size class和对象是否包含指针计算出span class
  4. 获取该span class指向的span
  5. 从span分配对象空间,从span找到第一个可用的内存块
  6. mcache向mcentral申请span,mcentral和mcache一样,都是0~133这134个span class级别,但每个级别都保存了2个span list,即2个span链表 nonempty:这个链表里的span,所有span都至少有1个空闲的对象空间。这些span是mcache释放span时加入到该链表的。empty:这个链表里的span,所有的span都不确定里面是否有空闲的对象空间。当一个span交给mcache的时候,就会加入到empty链表。过程: mcache向mcentral申请span时,mcentral会先从nonempty搜索满足条件的span,如果没有找到再从emtpy搜索满足条件的span,然后把找到的span交给mcache。
  7. mecentral向mheap申请span:mcentral需要向mheap提供需要的内存页数和span class级别,然后它优先从free中搜索可用的span。如果没有找到,会从scav中搜索可用的span。如果还没有找到,它会向OS申请内存,再重新搜索2棵树,必然能找到span。如果找到的span比需要的span大,则把span进行分割成2个span,其中1个刚好是需求大小,把剩下的span再加入到free中去,然后设置需要的span的基本信息,然后交给mcentral。

大对象分配

与mcentral向mheap申请内存的相同


http://www.niftyadmin.cn/n/288008.html

相关文章

stm32cubemx配置mpu6050——10分钟0基础到灵活使用

stm32cubemx配置mpu6050——10分钟0基础到灵活使用 10分钟速通!你没看错,就是10min,从0基础到灵活运用mpu6050。 不信?往下看看就会:嗷~原来如此 第一步 下载github开源代码。 https://github.com/leech001/MPU6050首…

使用iServer的Web打印功能打印临时图层tempLayersSet资源

作者:Carlo 背景:最近很多小伙伴想要了解如何将临时图层资源打印输出为图片?其实,官网已发布的10.2.1版本以及11.1.0版本的iServer就已经支持该功能,我们可以通过下文的介绍来学习使用。 步骤一、生成一个临时图层资源…

Js基础——原型链prototype

文章目录 原型链是啥玩意,我不太懂原型链类似于继承是吧给数组的prototype添加方法和使用案例 原型链是啥玩意,我不太懂 在 JavaScript 中,每个对象都有一个内部的 [[Prototype]] 属性,它指向当前对象的原型对象。原型对象也是一…

细数【SD-WEBUI】的模型:谁是最适合的模型从哪里找到它们

文章目录 (零)前言(一)基础模型(Stable-Diffusion模型)(1.1)ChilloutMix(仿真)(1.2)BasilMix(仿真)&#xff0…

78页2023年智慧公安发展构思与建设解决方案(ppt可编辑)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 总体架构10 建设方案-网络系统11 物联网15 视频网系统16 视频专网主干网根据运营商链路分为若干个环网部署,市局两台核心交换机位于网络核心层;部分…

mysql联合索引和普通索引的区别

MySQL中,联合索引和普通索引都是用于加速查询的索引类型。它们之间的区别在于索引的列数和列的顺序。 普通索引只对单个列进行索引,而联合索引则同时对多个列进行索引,这些列可以按照特定的顺序组合在一起。例如,可以为表中的两个…

速锐得基于能源油气生产智能监控的物联网应用

自2016年速锐得基于商用车国六环保排放监控管理开发以来,我们同时也接触了很多涉及商用车领域的深入项目,包括了大庆油田、山东能源、兖矿集团、陕北矿业等多家能源巨头在数字化、科技、无线远程控制、监控管理、生产效能等方面的智能化方向的趋势。 就目…

P5644 [PKUWC2018]猎人杀

P5644 [PKUWC2018]猎人杀 题目大意 一开始有 n n n个猎人,第 i i i个猎人有仇恨度 w i w_i wi​。每次可以开枪射杀一个活着的猎人。 假设活着的猎人为 i 1 , i 2 , … , i m i_1,i_2,\dots,i_m i1​,i2​,…,im​,则第 i k i_k ik​个猎人被射杀的概…