当前位置: 首页 > news >正文

Golang的内存管理--学习笔记

Go的内存管理

  • 内存的分级
    • arena区
    • Spans
    • Go中的mspan
  • 内存管理组件
    • mcache
    • mcentral
    • mheap
    • 内存的分配流程

内存的分级

使用的是多级分配的办法,将内存分为多级,进行分级管理,从而降低锁的粒度。并且将可用的堆内存采用二级管理,其中每个线程会有一个自己的内存池,只有在自己的内存池不够时才会去全局内存中获取,够用时首先使用自己的内存池。
基本概念

arena区

arena是堆区(即动态分配区域),被分隔成8k大小的页,将页组合起来称为mspan。
bitmap区域标识arena区域的那些地址保存了对象,并且使用4bit标识对象是否包含指针、GC标记信息。bitmap的的一个byte大小的内存标识的是arena的4个指针大小的内存(一个是8b),因此bitmap的大小512GB/(4*8B)=16GB。

Spans

spans中保存的是mspan(是arena中分隔页组成的基本内存管理单元)的指针,每个指针对应一页(会出现多个s指向同一个mspan),每一个mspan中也保存了对应的spans在回收时可以快速的找到

Go中的mspan

mspan是go内存管理的基本单元,是一片连续的8kb的页组成的大块内存。
mspan的特点:mspan是包含页的起始地址,页的span规格和页的数量的双端链表
关于mspan和object的关系

  1. mspan是根据自身的SizeClass来分割成若干个object,一个object可储存一个对象
  2. 在为对象分配内存的时候,mspan会分配一个和object大小接近的对象
    SizeClass和SpanClass的概念:
    Size_Class= Span_Class / 2由计算方式可以看出每一个Span_Class中有两个mspan。一个分配给包含有指针的对象,一个分配给不包含指针的对象。

mspan和SizeClass
Go1.9中mspan的SizeClass有67种,每个mspan分割的object大小是8*2n的倍数,写在代码中

// path: /usr/local/go/src/runtime/sizeclasses.go const _NumSizeClasses = 67 var class_to_size = [_NumSizeClasses]uint16{0, 8, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 416, 448, 480, 512, 576, 640, 704, 768, 896, 1024, 1152, 1280, 1408, 1536,1792, 2048, 2304, 2688, 3072, 3200, 3456, 4096, 4864, 5376, 6144, 6528, 6784, 6912, 8192, 9472, 9728, 10240, 10880, 12288, 13568, 14336, 16384, 18432, 19072, 20480, 21760, 24576, 27264, 28672, 32768}

在使用SizeClass的时候其中为0表示大对象,直接由对内存分配,小对象通过mspan来分配
SizeClass也决定了mspan所能分配的页数,写死在代码中


上图中由两个S指向同一个mspan这是因为两个s指向的P同属一个mspan,因此方便了互相查找。
startAddr 直接指向了arena区域,表示mspan的起始地址
allocBIts指向一个位图,每位代表一个块是否被分配了对象
allocCount 表示已经分配的对象个数

内存管理组件

Go中的分配器的3中组件的构成:mcache,mcentral,mheap

mcache

Go中为每个逻辑处理器P提供一个本地线程缓存即mcache,每个P同一时间只能运行一个goroutine,因此访问mcache是不需要加锁
mcache的结构体定义

//path: /usr/local/go/src/runtime/mcache.go type mcache struct { alloc [numSpanClasses]*mspan } numSpanClasses = _NumSizeClasses << 1

mcache中使用numSpanClasses作为索引管理多个用于分配的mspan,包含了所有规格的mspan,numSpanClasses是mspan中介绍的_NumSizeClasses的2倍,数组中的一半mspan是分配给有指针的对象,一半是给没有指针的对象。
在垃圾回收的时候没有指针的就不需要进一步扫描了
mcache的初始化:在初始化时没有mspan资源,使用过程中动态的从mcentral申请,会缓存起来,对象小于等于32k时使用mcashe中的mspan。

mcentral

mecntral:为mcache提供切分好的mspan资源,每个mcentral保存一种特定大小的全局mspan列表(分配的和未分配的)
mcentral被所有的工作线程共同享有,存在竞争,有锁机制

//path: /usr/local/go/src/runtime/mcentral.go type mcentral struct { // 互斥锁 lock mutex // 规格 sizeclass int32 // 尚有空闲object的mspan链表 nonempty mSpanList // 没有空闲object的mspan链表,或者是已被mcache取走的msapn链表 empty mSpanList // 已累计分配的对象个数 nmalloc uint64 }


图中的内容和结构体对应
获取mspan和归还流程

  1. 获取加锁;从nonempty链表找到一个可用的mspan;并将其从nonempty中删除;将取出的mspan加入到empty链表;将mspan返回给工作线程;解锁
  2. 归还加锁;将mspan从empty链表删除;将mspan加入到nonempty链表;解锁

mheap

mheap:代表Go程序持有的所有堆空间,Go程序使用一个mheap的全局对象_mheap来管理
当mcentral中没有空闲的mspan时会向mheap申请,没有mheap时会向操作系统申请。
mheap的主要工作:大对象分配内存,管理未切割的mspan

内存的分配流程

  1. 32k直接从mheap上分配

  2. <=16B的对象使用mcache的tiny分配器分配
  3. 二者之间的,首先计算对象规格,然后从mcache中相应的mspan中分配,如果mcache中没有则向mcentral申请,mcentral中没有则向mheap申请,mheap中没有则找操作系统。
http://www.jsqmd.com/news/1282733/

相关文章:

  • 物联网设备电池寿命优化与NBM5100A应用解析
  • 线上报价20万到店变15万|上海浦东爱马仕包包回收五大高频套路一次拆穿+真实案例 - 讯息早知道
  • 破局与红利:深职大职业本科生和专科生的“同校不同质” - 博客湾
  • OpenHarmony 小鸿 AI 开发实战 11:WS63 Agent 与 WebSocket 协议状态机
  • java 练习02 - 判断数字奇偶性
  • 抖音批量下载工具终极指南:从零基础到高效管理的完整解决方案
  • 全体目光看过来,2026信誉好的ai网站建设平台推荐来啦!
  • 2026年亦城人才·人工智能超级个体(OPC)认定办事指南
  • 良固阀门(河南)有限公司——郑州弹簧安全阀领域值得信赖的源头厂家 - 优企名品
  • 发现一篇很好的面经,分享给大家
  • 守护消费权益:北京通州黄金回收无套路合规交易自查攻略 - 生活时报
  • Linux运维实战:从零部署Web应用到Docker容器化完整指南
  • 儿童大脑潜能开发:科学基础与日常实践
  • Django学习1---安装 Django
  • 2026 年 7 月西城多款老翡翠比对,不同种质玉石分开评判 - 生活时报
  • 如何一键实现OBS多平台直播同步:obs-multi-rtmp插件完整指南
  • 鸿蒙应做自己的框架同时兼容安卓APP
  • 数据中心液冷技术:高效散热与节能解决方案
  • Java Lambda表达式实战:5大核心场景与性能优化
  • 寄大件快递Top1推荐!2026年7月最新寄件省钱榜单 - 快递物流资讯
  • KubeRay + Volcano构建云原生分布式AI训练调度体系
  • 2026手机网校搭建平台推荐,零基础也能即刻上手吗?
  • 石景山复古系列奢品浏览,工艺细节纳入藏品综合考量范围 - 生活时报
  • 五大神经网络核心原理与实战:从CNN到Transformer的深度学习指南
  • 快手视频下载终极指南:如何轻松获取无水印原创内容
  • AI面试工具选型决策手册(2024企业级避坑白皮书):覆盖12类岗位、8种语言、GDPR/《个人信息保护法》双合规验证
  • 计算机毕业设计之基于springboot的高校二手物品交易平台
  • Claude Opus登顶AA-Briefcase:智能体从问答到实战的知识工作革命
  • 学习笔记 第四章 设计网页文本
  • 2026免费去水印小程序怎么选怎么挑:3款工具横评,收藏备用 - 免费软件工具方法教程