0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

转载 golang内存分配

京东云 来源:jf_75140285 作者:jf_75140285 2024-09-05 14:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

wKgZombZS7KAXTU0AAWdjb5KQUo739.png



在 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 内存.

wKgZombZS7KAUIgMAAlqCZKg9HA790.png



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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3234

    浏览量

    76518
  • Go
    Go
    +关注

    关注

    0

    文章

    45

    浏览量

    12614
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    LuatOS的内存分配机制

    不同 LuatOS 硬件平台在内存布局上存在差异,Lua 运行内存、系统内存与 PSRAM 扩展内存分配方式各有区别。部分型号将系统与脚本
    的头像 发表于 04-16 12:37 114次阅读
    LuatOS的<b class='flag-5'>内存</b><b class='flag-5'>分配</b>机制

    如何为 S32DS 中的特定变量(RAM、闪存、数据闪存)强制使用特定内存区域?

    我正在使用S32K358并使用S32 设计工作室 (S32DS)作为我的 IDE。我想预留特定内存区域对于某些变量,并确保这些分配是在构建期间不受编译器或链接器的影响——尤其是当项目后期引入新变量或
    发表于 04-16 06:52

    DDR5内存断崖式下跌或引发踩踏式抛货?

    内存
    芯广场
    发布于 :2026年03月30日 15:35:23

    MangoTree Halo Ultra「全新PXI」,标配自动纠错内存#

    内存
    芒果树数字
    发布于 :2026年03月06日 15:59:34

    Linux内核伙伴系统内存申请函数详解:从原理到实战

    在 Linux 内核中,内存管理是整个系统稳定运行的基石,而伙伴系统(Buddy System) 作为内核物理内存分配的核心机制,更是驱动开发、内核模块开发的必备知识点。它通过 "2 的幂
    的头像 发表于 02-10 16:58 3730次阅读
    Linux内核伙伴系统<b class='flag-5'>内存</b>申请函数详解:从原理到实战

    Linux如何防止内存冲突?

    在聊这个话题之前,我们先回忆一下单片机系统中是如何分配内存的?如果没有bootloader,那硬件环境起来之后就直接进入主程序运行,如果有引导程序bootloader,那就需要设置好跳转地址,否则设置不对,系统就无法启动了。
    的头像 发表于 01-30 16:51 1437次阅读
    Linux如何防止<b class='flag-5'>内存</b>冲突?

    keil中c语言的动态分配内存

    在C程序中,通常将内存划分为以下六个区域: (1)内核区域。这块区域是操作系统的,用户不能使用。 (2)栈区。主要用于存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。栈内存分配
    发表于 01-21 06:04

    【「Linux 设备驱动开发(第 2 版)」阅读体验】+读深入理解Linux内核内存分配

    每个内存地址是虚拟的,不是直接指向RAM中的任何地址。当用户访问内存中的存储单元时,都会进行地址转换以匹配相应的物理内存。书籍的第10章讨论了五个主题,对Linux内核内存
    发表于 01-16 20:05

    嵌入式系统中,动态分配内存可能发生的问题是什么?

    尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)中动态分配内存的过程的。 那么嵌入式系统中,动态分配内存可能发生的问题是什么? 这 里,我期望应试者能提到
    发表于 12-22 09:42

    三种类型内存的使用

    的,因为底层数据会被默默删除。自动存储通常被称为“栈”。 分配的存储:运行malloc() 会返回的内存类型,这种内存会一直保留,直到被 free() 函数释放,所以可以被传递到任何地方,包括返回
    发表于 12-12 06:43

    从代码执行看单片机内存分配

    怎么分配和存储的,这些问题都和内寸有关系。 首先,单片机的内存可以大小分为ram和rom,这里就不再解释ram和rom的区别了,我们可以将其等效为flash和sram,其中根据flash和sram的定义
    发表于 12-02 07:58

    时标分配器、时间信号分配器、时钟分配

    时钟分配仪器仪表
    西安同步电子科技有限公司
    发布于 :2025年10月22日 10:40:51

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配

    FAQ_MA35_Family M4 RAM如何调整M4的内存分配
    发表于 09-02 06:07

    【HZ-T536开发板免费体验】5、安装sqlite3和使用golang读写数据库

    如果想在嵌入式设备上实现简单的设备管理功能,需要数据库和服务后端程序。服务端程序,我更倾向使用golang来实现。 安装sqlite3,使用ubuntu环境,可以直接用apt install安装程序
    发表于 08-26 00:04

    RTOS怎么实现共享内存

    K230的RTOS支持POSIX标准的共享内存吗 我尝试使用却失败 还是说需要源码部分配置的开启才可以使用 求教大佬
    发表于 08-04 08:06