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/7/28 20:25:10 阅读更多 →
终极指南: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/7/28 20:25:10 阅读更多 →
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/7/28 20:25:10 阅读更多 →

最新新闻

AI论文生成靠谱吗?2026年5款ai生成论文软件深度横评

AI论文生成靠谱吗?2026年5款ai生成论文软件深度横评

「AI论文生成」这四个字,在2026年的毕业生群体里已经无人不知。但真到自己上手时,问题一个接一个冒出来:生成的内容能过查重吗?文献是真的还是编的?写出来的东西导师那关过得去吗?为了搞清楚ai生成论文软件…

2026/7/28 20:36:16 阅读更多 →
大模型在非可验证领域的进步:从理论到企业级实践

大模型在非可验证领域的进步:从理论到企业级实践

1. 先搞清楚“非可验证领域”到底指什么很多人第一次看到“大模型在非可验证领域同样进步”这个标题,会下意识觉得这是纯理论讨论,离实际落地很远。但如果你做过企业级对话系统、内容生成或决策辅助工具,就会明白这个问题的实际分量——它直接…

2026/7/28 20:36:16 阅读更多 →
5分钟搞定魔兽争霸3:免费高效修复工具让经典游戏重获新生

5分钟搞定魔兽争霸3:免费高效修复工具让经典游戏重获新生

5分钟搞定魔兽争霸3:免费高效修复工具让经典游戏重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上频繁…

2026/7/28 20:36:16 阅读更多 →
AI论文助手哪个好用?2026年毕业生实测4款主流工具横评

AI论文助手哪个好用?2026年毕业生实测4款主流工具横评

离答辩还有二十天,论文进度条停在30%,导师的催稿消息一天三条——这是我上个月的真实状态。宿舍群里一讨论,发现大家都在用AI论文助手续命,但有人用得风生水起,有人却被坑得不轻:生成的文献是编的、大纲逻辑…

2026/7/28 20:36:16 阅读更多 →
DAY X项目日志系统:从开发到CI/CD的全流程实践

DAY X项目日志系统:从开发到CI/CD的全流程实践

1. 项目概述"DAY 15"这个看似简单的标题背后,实际上蕴含着丰富的可能性。作为一个开放式的项目命名,它可能指向多种场景:可能是某个30天挑战的第15天记录,可能是某个开发项目的里程碑节点,也可能是某个实验或…

2026/7/28 20:36:16 阅读更多 →
2026年裸眼3D动画制作公司推荐

2026年裸眼3D动画制作公司推荐

裸眼3D动画技术已从概念验证进入大规模商业化应用阶段,尤其在广告传媒、城市地标、文博文旅、展览展示等领域快速渗透。裸眼3D动画制作的核心挑战在于:既要呈现立体视觉冲击力,又要确保与不同显示终端的适配,同时对内容创意和制作…

2026/7/28 20:35:15 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻