当前位置: 首页 > news >正文

【转载】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 整数倍的内存, 用于分配一定范围的内存需求.

http://www.lryc.cn/news/430711.html

相关文章:

  • TPM管理培训:学以致用,才是硬道理
  • 2024年六月英语四级真题及解析PDF共9页
  • 自闭症儿童语言干预
  • webpack基本使用(基础配置)
  • 在js渲染的dom中的事件中传递对象
  • 服务器加速器如何应对大规模并行计算需求
  • C++/Qt 多媒体(续四)
  • 怎样把flv转换成mp4格式?8种可以推荐的视频转换方法
  • 【2024数学建模国赛赛题解析已出】原创免费分享
  • Windows安装使用Docker
  • 【wsl2】从C盘迁移到G盘
  • 低代码技术新趋势——逆向工程
  • HTTP 二、进阶
  • 【Hot100】LeetCode—35. 搜索插入位置
  • 001集——CAD—C#二次开发入门——开发环境基本设置
  • Java类和对象——快速自动生成带参数的结构
  • Python操作数据库的ORM框架SQLAlchemy快速入门教程
  • 提交MR这个词儿您知道是什么意思吗?
  • Linux sentinel写法
  • 顶级域名服务器 - TLD服务器
  • 【LeetCode】01.两数之和
  • 便宜好用的云手机盘点
  • pdf怎么压缩小一些?推荐的几种PDF压缩方法
  • Linux终端简单配置(Vim、oh-my-zsh和Terminator)
  • js模块化 --- commonjs规范 原理详解
  • kubeadm部署 Kubernetes(k8s) 高可用集群【V1.28 】
  • 【MySQL】MySQL Workbench下载安装、环境变量配置、基本MySQL语句、新建Connection
  • CrowdStrike 的失败如何凸显了左移测试的重要性
  • HarmonyOS开发实战( Beta5版)高负载组件的渲染实践规范
  • NLP从零开始------16.文本中阶处理之序列到序列模型(1)