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中没有则找操作系统。

相关新闻

Minecraft世界管理终极指南:用MCA Selector免费开源工具高效清理区块

Minecraft世界管理终极指南:用MCA Selector免费开源工具高效清理区块

Minecraft世界管理终极指南:用MCA Selector免费开源工具高效清理区块 【免费下载链接】mcaselector A tool to select chunks from Minecraft worlds for deletion or export. 项目地址: https://gitcode.com/gh_mirrors/mc/mcaselector 你是否曾因Minecraft…

2026/7/28 20:22:41阅读更多 →
【JVM原理详解】20-String常量池与intern深度解析

【JVM原理详解】20-String常量池与intern深度解析

String 常量池与 intern 深度解析 引言 String 是 Java 中使用最频繁的对象类型,也是设计最特殊的类之一。从面试经典题"new String(‘ab’) 创建了几个对象"到生产环境的 OOM 排查,String 常量池都是一个绕不开的知识点。 String 常量池的位置…

2026/7/28 20:22:41阅读更多 →
终极指南:3分钟掌握SQLite Viewer数据导出技巧

终极指南:3分钟掌握SQLite Viewer数据导出技巧

终极指南:3分钟掌握SQLite Viewer数据导出技巧 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 您是否曾经需要快速查看SQLite数据库内容,却不想安装复杂的软件?…

2026/7/28 20:22:41阅读更多 →
CUDA实践(1)--性能分析工具

CUDA实践(1)--性能分析工具

本文记录几种CUDA实践中常用的运行计时和性能分析工具。1. 运行计时虽然标准C语言也有相关计时方法,但是由于CPU与GPU之间的同步问题可能造成测时不准确,这里分别介绍这两种测试方法:(1)标准C语言计时函数C语言当前版本…

2026/7/28 21:39:00阅读更多 →
高效学习新技术:系统化方法与工具链实践

高效学习新技术:系统化方法与工具链实践

1. 项目概述 作为一名长期活跃在技术社区的从业者,我经常收到读者关于如何高效学习新技术的咨询。今天我想分享一个近期完成的创新实训项目中的学习方法论,这是我经过多年实践总结出的一套系统化学习方案。 这个学习体系的核心在于将碎片化的知识获取转…

2026/7/28 21:39:00阅读更多 →
基于Codex与提示工程实现AI文本风格化:以“摇曳鳗的一舞”为例

基于Codex与提示工程实现AI文本风格化:以“摇曳鳗的一舞”为例

最近在尝试将AI生成的内容与特定风格结合时,遇到了一个有趣的挑战:如何让一个通用的代码生成模型(比如Codex)去模仿一种极具特色和氛围感的网络文化风格,例如“摇曳鳗的一舞”。这不仅仅是简单的文本改写,更…

2026/7/28 21:39:00阅读更多 →
TPIC7710EVM评估模块深度解析:从硬件设计到软件驱动的汽车电子电机控制实践

TPIC7710EVM评估模块深度解析:从硬件设计到软件驱动的汽车电子电机控制实践

1. 项目概述与核心价值在汽车电子,特别是车身控制和安全系统的开发领域,评估模块(EVM)扮演着至关重要的角色。它远不止是一块简单的电路板,而是一个集成了目标芯片、外围关键电路、调试接口和配套软件的完整开发与验证…

2026/7/28 21:39:00阅读更多 →
AI接单、知识付费、自动化变现,全链路拆解新手首月盈利路径,错过这波红利期再等半年

AI接单、知识付费、自动化变现,全链路拆解新手首月盈利路径,错过这波红利期再等半年

更多请点击: https://kaifayun.com 第一章:AI副业的本质认知与红利窗口判断 AI副业并非简单地“用AI工具接单”,而是以算法能力、数据理解力和垂直领域知识为支点,重构个人价值交付方式的新型生产关系。其本质是将AI作为可复用的…

2026/7/28 21:39:00阅读更多 →
Selenium+Pytest自动化测试框架实战

Selenium+Pytest自动化测试框架实战

🔥 从零搭建 Selenium Pytest 自动化测试框架(PO 模式实战)作者:[你的名字] 发布日期:2026-07-28 关键词:Selenium、Pytest、Page Object、UI 自动化、驱动管理、日志配置&#x1f…

2026/7/28 21:36:59阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/28 4:06:39阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/28 2:08:06阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/28 1:38:28阅读更多 →
告别臃肿!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:29阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

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

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

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

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

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

2026/7/28 0:00:29阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/28 20:22:24阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/28 3:17:03阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/28 2:35:58阅读更多 →