Golang的内存管理--学习笔记
Go的内存管理内存的分级arena区SpansGo中的mspan内存管理组件mcachemcentralmheap内存的分配流程内存的分级使用的是多级分配的办法将内存分为多级进行分级管理从而降低锁的粒度。并且将可用的堆内存采用二级管理其中每个线程会有一个自己的内存池只有在自己的内存池不够时才会去全局内存中获取够用时首先使用自己的内存池。基本概念arena区arena是堆区即动态分配区域被分隔成8k大小的页将页组合起来称为mspan。bitmap区域标识arena区域的那些地址保存了对象并且使用4bit标识对象是否包含指针、GC标记信息。bitmap的的一个byte大小的内存标识的是arena的4个指针大小的内存一个是8b因此bitmap的大小512GB/(4*8B)16GB。Spansspans中保存的是mspan是arena中分隔页组成的基本内存管理单元的指针每个指针对应一页会出现多个s指向同一个mspan每一个mspan中也保存了对应的spans在回收时可以快速的找到Go中的mspanmspan是go内存管理的基本单元是一片连续的8kb的页组成的大块内存。mspan的特点mspan是包含页的起始地址页的span规格和页的数量的双端链表关于mspan和object的关系mspan是根据自身的SizeClass来分割成若干个object一个object可储存一个对象在为对象分配内存的时候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中组件的构成mcachemcentralmheapmcacheGo中为每个逻辑处理器P提供一个本地线程缓存即mcache每个P同一时间只能运行一个goroutine因此访问mcache是不需要加锁mcache的结构体定义//path: /usr/local/go/src/runtime/mcache.go type mcache struct { alloc [numSpanClasses]*mspan } numSpanClasses _NumSizeClasses 1mcache中使用numSpanClasses作为索引管理多个用于分配的mspan包含了所有规格的mspannumSpanClasses是mspan中介绍的_NumSizeClasses的2倍数组中的一半mspan是分配给有指针的对象一半是给没有指针的对象。在垃圾回收的时候没有指针的就不需要进一步扫描了mcache的初始化在初始化时没有mspan资源使用过程中动态的从mcentral申请会缓存起来对象小于等于32k时使用mcashe中的mspan。mcentralmecntral为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和归还流程获取加锁从nonempty链表找到一个可用的mspan并将其从nonempty中删除将取出的mspan加入到empty链表将mspan返回给工作线程解锁归还加锁将mspan从empty链表删除将mspan加入到nonempty链表解锁mheapmheap代表Go程序持有的所有堆空间Go程序使用一个mheap的全局对象_mheap来管理当mcentral中没有空闲的mspan时会向mheap申请没有mheap时会向操作系统申请。mheap的主要工作大对象分配内存管理未切割的mspan内存的分配流程32k直接从mheap上分配16B的对象使用mcache的tiny分配器分配二者之间的首先计算对象规格然后从mcache中相应的mspan中分配如果mcache中没有则向mcentral申请mcentral中没有则向mheap申请mheap中没有则找操作系统。

相关新闻

N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案

N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案

N_m3u8DL-RE终极指南:跨平台流媒体下载完整解决方案 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_m3u8DL-RE …

2026/10/9 16:43:33 阅读更多 →
终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案

终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案

终极指南:uBlock Origin如何成为浏览器隐私保护的最佳解决方案 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock uBlock Origin是一款高效…

2026/10/2 20:17:59 阅读更多 →
5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南

5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南

5分钟掌握AI视频剪辑:FunClip智能语音识别剪辑完整指南 【免费下载链接】FunClip FunASR-powered video transcription, subtitle generation, and LLM-assisted clipping tool with a local Gradio UI. 项目地址: https://gitcode.com/GitHub_Trending/fu/FunCli…

2026/10/6 20:50:00 阅读更多 →

最新新闻

RBAC的术语大全的庖丁解牛

RBAC的术语大全的庖丁解牛

根因 业务系统(OA、后台管理、ERP、企业数字化平台)必然存在权限控制需求。 最简单的权限写法:直接给用户写死判断 if($user_id 1) {允许操作}。这种硬编码方式,用户一多、岗位变动,代码改不停,完全无法维…

2026/10/11 1:55:43 阅读更多 →
1000MW机组燃料智能管控系统:从经验Excel到闭环燃烧控制

1000MW机组燃料智能管控系统:从经验Excel到闭环燃烧控制

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 1:55:43 阅读更多 →
基于PJ85718DM与PIC32MZ的HVAC双通道远端温度监测方案

基于PJ85718DM与PIC32MZ的HVAC双通道远端温度监测方案

1. 从一颗温度传感器说起:为什么HVAC系统需要"双通道"测温做过嵌入式暖通空调控制板的人大概都有过这样的经历:板子上明明焊了一颗精度不错的数字温度传感器,整机跑起来却发现读数和实际环境温度差了三四度,压缩机启停逻…

2026/10/11 1:55:43 阅读更多 →
Prompt 前缀缓存工程实践:利用 KV Cache 命中机制将多轮对话固定成本压降 90%

Prompt 前缀缓存工程实践:利用 KV Cache 命中机制将多轮对话固定成本压降 90%

在企业级 AI 智能体与长文本 RAG 系统的成本核算中,有一笔长期被研发人员忽视的巨大开销:多轮对话中的静态上下文重复计费。 以一个标准的企业级客服智能体为例:为了让大模型表现出符合企业规范的严谨人设,系统提示词(…

2026/10/11 1:55:43 阅读更多 →
FreeCAD源码分析:Externsion机制

FreeCAD源码分析:Externsion机制

本文分析FreeCAD中Extension机制的实现。 注1:限于研究水平,文中分析难免有不当之处,欢迎批评指正。 注2:本文档将不定期更新。 一、机制概览 FreeCAD 的文档对象(App::DocumentObject)需要同时支持几何、分…

2026/10/11 1:55:43 阅读更多 →
C语言数据结构笔记:动态数组

C语言数据结构笔记:动态数组

前言 本文面向编程零基础小白,用生活化案例通俗讲解C语言中动态数组核心概念、组成要素与完整实操流程,手把手演示动态数组的完整可运行代码示例。 一、核心概念 指针变量 指的是可以储存某个 内存地址 的变量。一般来说,指针变量并不储存…

2026/10/11 1:54:43 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →