【转载】golang内存分配

[复制链接]
发表于 2026-1-27 18:47:45 | 显示全部楼层 |阅读模式
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 整数倍的内存, 用于分配肯定范围的内存需求.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表