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

审核编辑 黄宇

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

    关注

    8

    文章

    3071

    浏览量

    74414
  • Go
    Go
    +关注

    关注

    0

    文章

    44

    浏览量

    12274
收藏 人收藏

    评论

    相关推荐

    hyper v 内存,hyper v 内存设置的操作步骤和方法是什么?

    在利用Hyper-V搭建和管理虚拟机的过程中,合理设置虚拟机的内存至关重要。内存分配是否恰当,会直接影响到虚拟机的运行性能和稳定性。若内存分配
    的头像 发表于 01-24 15:22 162次阅读
    hyper v <b class='flag-5'>内存</b>,hyper v <b class='flag-5'>内存</b>设置的操作步骤和方法是什么?

    Golang配置代理方法

    由于一些客观原因的存在,我们开发 Golang 项目的过程总会碰到无法下载某些依赖包的问题。这不是一个小问题,因为你的工作会被打断,即便你使用各种神通解决了问题,很可能这时你的线程已经切换到其他的事情上了(痛恨思路被打断!)。所以最好是一开始我们就重视这个问题,并一劳永逸的解决它。
    的头像 发表于 11-11 11:17 459次阅读
    <b class='flag-5'>Golang</b>配置代理方法

    内存管理的硬件结构

    常见的内存分配函数有malloc,mmap等,但大家有没有想过,这些函数在内核中是怎么实现的?换句话说,Linux内核的内存管理是怎么实现的?
    的头像 发表于 09-04 14:28 417次阅读
    <b class='flag-5'>内存</b>管理的硬件结构

    如何自定义内存控制器的设置

    在FreeRTOS中自定义内存控制器的设置,主要涉及到内存分配策略的选择和配置。FreeRTOS提供了多种内存分配策略,如heap_1、he
    的头像 发表于 09-02 14:28 600次阅读

    堆栈和内存的基本知识

    本文主要聊聊关于堆栈的内容。包括堆栈和内存的基本知识。常见和堆栈相关的 bug,如栈溢出,内存泄漏,堆内存分配失败等。后面介绍软件中堆栈统计的重要性,以及如何使用工具工具软件中堆栈使用
    的头像 发表于 08-29 14:10 593次阅读
    堆栈和<b class='flag-5'>内存</b>的基本知识

    可以用os_malloc() 分配多少内存?有哪些限制?

    我可以用 os_malloc() 分配多少内存?有哪些限制?
    发表于 07-15 06:32

    esp8266如何正确释放分配内存

    我为结构数组分配内存,这是我的代码: size_t taskAmount; object *tasks = Parsejson(subbuff,sizeof(subbuff),&
    发表于 07-12 12:34

    ESP32S3+LVGL创建一个界面,请问能只在SPIRAM分配内存,IRAM不分配吗?

    各位前辈好。ESP32S3+LVGL的开发的过程中发现,创建一个界面,会同时在SPIRAM和IRAM分配相同大小的内存。请问能只在SPIRAM分配内存,IRAM不
    发表于 06-06 07:45

    FreeRTOS如何在中断中调用内存分配函数?

    最近在玩FreeRTOS,遇到一个问题,就是不知如何在中断中调用内存分配函数。pvPortMalloc函数中会调用xTaskResumeAll,而这个函数不能再中断调用,所以请问在中断中进行内存
    发表于 05-08 08:25

    使用STVD建一个STM8的工程,.h文件在哪里添加?内存分配函数是哪个?

    使用STVD建一个STM8的工程,.h文件在哪里添加?内存分配函数是哪个?芯片是怎样启动的?Source Files 下面的mapping.asmand main.asm 是做什么用的文件?
    发表于 04-28 09:05

    freertos任务创建,每一个任务分配内存是多大才好,怎么计算呢?

    小白刚刚接触freertos,想问一下就创建任务而言,每一个任务分配内存是多大才好,怎么计算呢? 另外,每个任务的执行周期怎么确定?在任务里面放延时函数吗?
    发表于 04-23 06:39

    Golang为何舍弃三元运算符

    golang中不存在?:运算符的原因是因为语言设计者已经预见到三元运算符经常被用来构建一些极其复杂的表达式。虽然使用if进行替代会让代码显得更长,但这毫无疑问可读性更强。
    的头像 发表于 04-03 15:13 778次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放
    发表于 03-19 11:38 585次阅读
    C语言<b class='flag-5'>内存</b>泄漏问题原理

    Linux内核内存管理之内核非连续物理内存分配

    我们已经知道,最好将虚拟地址映射到连续页帧,从而更好地利用缓存并实现更低的平均内存访问时间。然而,如果对内存区域的请求并不频繁,那么考虑基于通过连续线性地址访问非连续页帧的分配方案是有意义的。该模式
    的头像 发表于 02-23 09:44 1098次阅读
    Linux内核<b class='flag-5'>内存</b>管理之内核非连续物理<b class='flag-5'>内存</b><b class='flag-5'>分配</b>

    Linux内核内存管理之ZONE内存分配

    内核中使用ZONE分配器满足内存分配请求。该分配器必须具有足够的空闲页帧,以便满足各种内存大小请求。
    的头像 发表于 02-21 09:29 966次阅读