Go堆内存管理

news2024/11/28 0:35:16

内存管理单元

内存管理单元有如下

  • page: x64下大小为8k。go与OS内存申请与释放都是以page为单位

  • span: 多个连续page组成,是内存管理的基本单元

  • mcache: 每个P所有的cache,包含多个空闲内存块链表,不同的链表上的内存块大小可能是不相同的

  • mcentral: 是所有线程共享的缓存,需要加锁访问。按 Span class 对 Span 分类,串联成链表,当 mcache 的某个级别 Span 的内存被分配光时,它会向 mcentral 申请 1 个当前级别的 Span

  • heapArena: heapArena 是由 mheap 管理的更小的内存块。整个堆内存被划分为多个 heapArena,每个 heapArena 通常是 64MB(在 64 位系统上)的大小。每个 heapArena 都有自己独立的管理数据结构,用于跟踪和管理该 heapArena 中的内存分配情况

  • mheap: 堆内存的抽象,把从 OS 申请出的内存页组织成 Span,并保存起来

    mheap将span组织为树结构,按照page数量进行排序

    • free: 保存的 span 是空闲并且非垃圾回收的 span
    • scav: 保存的是空闲并且已经垃圾回收的 span

在这里插入图片描述

此外,内存管理还存在大小概念,用于更好地分配合适的内存块

  • objectSize: 申请内存的实际大小

  • size class: 表示 size 的级别,相当于把 size 归类到一定大小的区间段,比如 size[1,8] 属于 size class 1size(8,16] 属于 size class 2

  • span class: 与size class对应,表示特定大小的span类别,并且还有有指针和无指针两个版本(无指针不需要gc扫描)

    共有0-133级别,每个级别都有nonempty和empty span链表。

    • nonempty 保证所有 span 都至少有 1 个空闲的对象空间。这些 span 是 mcache 释放 span 时加入到该链表的
    • empty 所有的 span 都不确定里面是否有空闲的对象空间。当一个 span 交给 mcache 的时候,就会加入到 empty 链表

分配过程

Go按照不同对象大小有不同的分配逻辑

微对象(0, 16B)

mcache中的微分配器进行分配的

在mcache结构体中有如下字段

  • tiny uintptr: 指向当前微小块(tiny block)的起始位置,或者如果当前没有微小块则为 nil.

    用于跟踪分配给微小对象的内存块

  • tinyoffset uintptr: 表示当前微小块的偏移量,用于指示在当前微小块中已使用的内存位置

  • tinyAllocs uintptr:记录由拥有这个 mcache 的 P(Processor)执行的微小分配次数

微分配器将多个微小块分配请求合并到同一个内存块中,只有当内存块中的所有对象都需要被回收时,整片内存才可能被回收。

微分配器管理的对象不可以是指针类型,管理多个对象的内存块大小可以通过变量 maxTinySize 调整,在默认情况下,内存块的大小为 16 字节

小对象[16B, 32KB]

根据span class映射表寻找span,分配对象空间

  1. 计算对象所需内存大小size
  2. 映射size到size class
  3. 根据size class和对象是否包含指针计算出span class
  4. 获取该span class指向的span

在具体申请span上

  • 会首先向mcache中申请,不行则向mcentral申请
  • mcentral会先从non empty搜索满足条件的span,然后再从empty进行寻找
  • 在mcentral也找不到的情况下,就向mheap申请span
  • mheap会优先从free搜索可用的span,然后再从scav寻找
  • 最后还是找不到,就只能向OS申请内存了

大对象(32KB以上)

直接runtime.largeAlloc分配大块内存

Ref

  1. https://medium.com/safetycultureengineering/an-overview-of-memory-management-in-go-9a72ec7c76a8
  2. https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-memory-allocator/
  3. https://xiaoming.net.cn/2020/12/16/Go%20%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86%E4%B8%8E%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1897127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

出海拓圈! 环保企业走出去之马来西亚水环境项目考察

中办、国办印发《关于构建现代环境治理体系的指导意见》,其中明确提出“鼓励企业参与绿色‘一带一路’建设,带动先进的环保技术、装备、产能走出去”。近年来中国积极参与全球生态环境治理,在环境资源综合管理、水旱灾害防御、固危废无害化处…

Resilience4j之RateLimiter和常见限流算法总结

官网地址:https://resilience4j.readme.io/docs/ratelimiter 中文文档:https://resilience4j.readme.io/docs/ratelimiter 【1】概述 Resilience4j提供了一个限流器,它将从epoch开始的所有纳秒划分为多个周期。每个周期的持续时间RateLimi…

1975react社区问答管理系统开发mysql数据库web结构node.js编程计算机网页源码

一、源码特点 react 社区问答管理系统是一套完善的完整信息管理类型系统,结合react.js框架和node.js后端完成本系统,对理解react node编程开发语言有帮助系统采用node框架(前后端分离)),系统具有完整的源…

如何有效管理你的Facebook时间线?

Facebook作为全球最大的社交平台之一,每天都有大量的信息和内容在用户的时间线上展示。有效管理你的Facebook时间线,不仅可以提升用户体验,还能够帮助你更好地控制信息流和社交互动。本文将探讨多种方法和技巧,帮助你有效管理个人…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【19】认证服务03—分布式下Session共享问题

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【19】分布式下Session共享问题 session原理分布式下session共享问题Session共享问题解决—session复制Session共享问题解决—客户端存储Session共享问题解决—hash一致性Session共享问题…

【C++】 解决 C++ 语言报错:Invalid Use of Incomplete Type

文章目录 引言 在 C 编程中,“Invalid Use of Incomplete Type” 是一种常见错误。此错误通常在程序试图使用未完全定义的类或结构时发生。这种错误不仅会导致编译失败,还可能导致程序行为不可预测。本文将详细探讨无效使用不完整类型的成因、检测方法及…

【Redis】真行,原来是这样啊! --Redis自动序列化和手动序列化的区别(存储结构、内存开销,实际写法)

对于Redis有两种序列化和反序列化的方式, 方式一: 一种是通过 注入RedisTemplate 对象,找个对象,通过配置类进行一定的配置,使得使用RedisTemplate 对象时,便会使用配置的那些键、值的序列化方式&#xff…

【人工智能】--强化学习(2.0)

个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉强化学习与有监督学习的区别 🍈数据特点 🍈学习目标 🍈反馈机制 🍈策略…

数学建模MATLAB绘图大全

最近快要开始一年一度的数学建模竞赛啦,接下来争取每天更一篇数学建模算法!(当然这是理想状态下),今天就先更一些MATLAB常用的绘图吧,论文赏心悦目的关键就在于丰富多彩的图,好看的图一定会成为…

Linux 查看磁盘是不是 ssd 的方法

lsblk 命令检查 $ lsblk -d -o name,rota如果 ROTA 值为 1,则磁盘类型为 HDD,如果 ROTA 值为 0,则磁盘类型为 SSD。可以在上面的屏幕截图中看到 sda 的 ROTA 值是 1,表示它是 HDD。 2. 检查磁盘是否旋转 $ cat /sys/block/sda/q…

深入理解【 String类】

目录 1、String类的重要性 2、常用方法 2、1 字符串构造 2、2 String对象的比较 2、3 字符串查找 2、4字符转换 数值和字符串转换: 大小写转化: 字符串转数组: 格式转化: 2、5 字符串替换 2、6字符串拆分 2、7 字符串…

【pytorch12】什么是梯度

说明 导数偏微分梯度 梯度:是一个向量,向量的每一个轴是每一个方向上的偏微分 梯度是有方向也有大小,梯度的方向代表函数在当前点的一个增长的方向,然后这个向量的长度代表了这个点增长的速率 蓝色代表比较小的值,红色…

初阶数据结构二叉树练习系列(1)

这个系列的文章将带大家一起刷题,并且总结思路 温馨提示:本篇文章里的练习题仅适合刚学完二叉树的小白使用 相同的树 思路 情况分析:第一种情况:两棵树都为空 → 返回true 第二种情况&am…

Vue +Echarts 二维数组获取最大值和最小值以及索引

实现图例效果 获取最大值方法&#xff1a; maxSecond(array) {let max Number.MIN_SAFE_INTEGER;for (let i 0; i < array.length; i) {const secondElement parseInt(array[i][1]);if (secondElement > max) {max secondElement;}}return max;}, 获取最大值索引&…

数据结构——(单)链表

文章目录 1. 结构 2. 链表的分类 1. 单链表 2. 双链表 3. 循环单链表 4. 循环双链表 3. 优缺点 4. 单链表函数 5. 单链表代码实现 1. 结构 逻辑结构 链表是一种线性结构&#xff0c;由一系列结点&#xff08;Node&#xff09;组成。每个结点包含一个数据元素和一个指…

Linux库概念及相关编程(动态库-静态库)

Linux库概念及相关编程 分文件编程案例 分文件编程是指将程序按功能模块划分成不同的文件进行编写&#xff0c;这种方法有以下好处&#xff1a; 功能责任划分&#xff1a;每个文件对应一个功能模块&#xff0c;职责明确&#xff0c;易于理解和维护。方便调试&#xff1a;可以…

绝地求生PUBG点击开始游戏一直在加载不读条计时间的解决办法

绝地求生PUBG作为一款引领潮流的大逃杀游戏&#xff0c;凭借其紧张刺激的对抗体验赢得了全球玩家的喜爱。 即使是游戏已经上线很长时间了&#xff0c;但是游戏现在依旧是很火爆&#xff0c;还有很多玩家下载游戏进行游玩。然而&#xff0c;一些为玩家在游戏中遇到了点击开始游戏…

java版本ERP管理系统源码 Spring Cloud ERP_ERP系统_erp软件_ERP管理系统

在当今数字化时代&#xff0c;企业对高效、稳定且易于扩展的管理系统的需求日益增长。为了满足这一需求&#xff0c;我们精心打造了一款基于Java技术的ERP&#xff08;Enterprise Resource Planning&#xff09;管理系统。该系统充分利用了Spring Cloud Alibaba、Spring Boot、…

Butterfly主题文章标题改成转动小风车

效果 标题级别不同小风车颜色不同&#xff0c;鼠标移入会有转动变慢及变色效果。 新建css 建议在/source下创建诸如img/css/js等文件夹&#xff0c;存放文章或网站用的素材&#xff0c;分门别类后续也方便维护。 Hexo打包的时候&#xff0c;会自动把/source下的文件&#…

JavaScript基础知识5(对象)

JavaScript基础知识5&#xff08;对象&#xff09; 对象创建对象使用对象字面量使用 new Object() 访问和修改属性点表示法方括号表示法 动态添加和删除属性添加属性删除属性 对象方法对象的遍历常用属性和方法数学常量数学函数三角函数 使用示例生成随机整数计算圆的面积求最大…