【转载】golang内存分配

作者:钱文

Go 的分配采用了类似 tcmalloc 的结构.特点: 使用一小块一小块的连续内存页, 进行分配某个范围大小的内存需求. 比如某个连续 8KB 专门用于分配 17-24 字节,以此减少内存碎片. 线程拥有一定的 cache, 可用于无锁分配.

同时 Go 对于 GC 后回收的内存页, 并不是马上归还给操作系统, 而是会延迟归还, 用于满足未来的内存需求.

在 1.10 以前 go 的堆地址空间是线性连续扩展的, 比如在 1.10(linux amd64)中, 最大可扩展到 512GB. 因为 go 在 gc 的时候会根据拿到的指针地址来判断是否位于 go 的 heap 的, 以及找到其对应的 span, 其判断机制需要 gc heap 是连续的. 但是连续扩展有个问题, cgo 中的代码(尤其是 32 位系统上)可能会占用未来会用于 go heap 的内存. 这样在扩展 go heap 时, mmap 出现不连续的地址, 导致运行时 throw.

在 1.11 中, 改用了稀疏索引的方式来管理整体的内存. 可以超过 512G 内存, 也可以允许内存空间扩展时不连续.在全局的 mheap struct 中有个 arenas 二阶数组, 在 linux amd64 上,一阶只有一个 slot, 二阶有 4M 个 slot, 每个 slot 指向一个 heapArena 结构, 每个 heapArena 结构可以管理 64M 内存, 所以在新的版本中, go 可以管理 4M*64M=256TB 内存, 即目前 64 位机器中 48bit 的寻址总线全部 256TB 内存.

go 的内存分配类似于 tcmalloc, 采用了 span 机制来减少内存碎片. 每个 span 管理 8KB 整数倍的内存, 用于分配一定范围的内存需求.

相关推荐
AI大模型4 分钟前
Agent发展趋势?信通院发布“2025智能体十大关键词”
程序员·llm·agent
程序员鱼皮2 小时前
我用 AI 做了个小程序,治好了我的学习焦虑症!
程序员·ai编程·trae
SimonKing3 小时前
SpringBoot多模板引擎整合难题?一篇搞定JSP、Freemarker与Thymeleaf!
java·后端·程序员
大模型教程21 小时前
全面对比主流大模型,了选对大模型真的可以事半功倍!
程序员·llm·agent
大模型教程21 小时前
谷歌官方出品建议人手一份!万人收藏的提示词工程指导白皮书(附中文版)!
程序员·llm·agent
AI大模型21 小时前
狂揽 133K Star!优质开源AI项目-提示词指南/提示词工程
程序员·llm·agent
AI大模型21 小时前
Transformer | 一文带你了解Embedding(从传统嵌入方法到大模型Embedding)
程序员·llm·agent
文心快码BaiduComate1 天前
北京互联网大会 | 百度副总裁陈洋:AI Coding为新质生产力注入“新码力”
前端·后端·程序员
leobertlan1 天前
好玩系列:脚本和插件使我快乐
前端·程序员·gradle
京东云开发者1 天前
代码之美-代码整洁之道
程序员