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

    文章

    2901

    浏览量

    73514
  • Go
    Go
    +关注

    关注

    0

    文章

    43

    浏览量

    12210
收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

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

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

    如何使用Golang连接MySQL

    首先我们来看如何使用Golang连接MySQL。
    的头像 发表于 01-08 09:42 2920次阅读
    如何使用<b class='flag-5'>Golang</b>连接MySQL

    FreeRTOS内存机制详解

    FreeRTOS是一种实时操作系统,它提供了多种内存分配方式,包括动态内存分配和静态内存分配
    的头像 发表于 12-31 16:49 2037次阅读
    FreeRTOS<b class='flag-5'>内存</b>机制详解

    Golang接口的作用和应用场景

    Golang(Go)作为一门现代的静态类型编程语言,提供了许多强大的特性,其中之一便是接口(interface)。接口是Golang中的一个核心概念,它具有广泛的应用场景,可以帮助开发者实现
    的头像 发表于 12-05 10:44 983次阅读

    malloc 申请内存的两种方式

    我们知道malloc() 并不是系统调用,也不是运算符,而是 C 库里的函数,用于动态分配内存。 malloc 申请内存的时候,会有两种方式向操作系统申请堆内存: 方式一:通过 brk
    的头像 发表于 11-13 11:42 2157次阅读
    malloc 申请<b class='flag-5'>内存</b>的两种方式

    内存池的使用场景

    山中,非常容易出现内存泄漏导致mmo的问题。 为了解决这两个问题,内存池就应运而生了。内存池预先分配一大块内存来做一个
    的头像 发表于 11-10 17:19 551次阅读
    <b class='flag-5'>内存</b>池的使用场景

    如何高效管理MCU内存? 多种分配算法对比?

    如何高效管理MCU内存? 多种分配算法对比?
    的头像 发表于 10-17 18:21 1019次阅读
    如何高效管理MCU<b class='flag-5'>内存</b>? 多种<b class='flag-5'>分配</b>算法对比?

    C语言程序设计中动态内存分配如何实现

    C语言程序设计中,动态内存分配如何实现,需要注意哪些问题?
    发表于 09-28 16:53 1130次阅读

    Linux内存方面的初始化和常见的内存分配方式

    | --- >mem_init linux4.14/init/main.c 在 mem_init 函数中会初始化伙伴系统和 slab 分配器。 先说两个概念: 外部碎片 :有一段小内存,夹在两个大内存中间,两个大
    的头像 发表于 09-28 16:13 667次阅读
    Linux<b class='flag-5'>内存</b>方面的初始化和常见的<b class='flag-5'>内存</b><b class='flag-5'>分配</b>方式

    请问单片机运行时候内存是如何分配的?

    请问单片机运行时候内存是如何分配的? 是在链接脚本中人工定义?还是编译器根据某种算法自动分配
    发表于 09-27 08:16

    请问PCIe模式如何查看VPU内存分配情况?

    PCIe模式如何查看VPU内存分配情况?
    发表于 09-18 08:47