Golang内存分配


Go内存分配语雀笔记整理

    • Golang内存模型设计理念思考
    • 核心代码阅读
      • mspan
      • mcache
      • mcentral中心缓存
      • mheap
      • 分配过程

Golang内存模型设计理念思考

golang内存分配基于TCmalloc模型,它核心在于:空间换时间,一次缓存,多次复用;
为何要有这种缓存机制?如果golang每次分配内存都向操作系统申请,需要切换到内核态发起系统调用,(权级切换时的开销是很大的)代价太高;所以一次缓存,多次复用(类似GMP的设计思想尽可能不切到内核态)

堆mheap这种数据结构就是一次缓存得到的那部分。 在操作系统视角中,mheap就是用户进程缓存的内存,在golang视角中,mheap就是内存的源头
mheap作为进程中的内存来源,全局唯一,具有全局锁,如果mheap直接分配,那么存取性能是非常可怕的,为了提高分配效率,就要实现锁的粒度更细、甚至无锁,goalng借鉴操作系统的多级缓存模型(L1,L2,L3,RAM,磁盘),设计了一种3层缓存模型:mheap、 mcentral、 mchace(GMP中的P相当于一个CPU,而mache就是P本地私有的内存,它冗余了各种等级的mspan,P本地私有不涉及并发行为,所以不需要加锁);

image.png

核心代码阅读

mspan

mspan是最小的内存管理单元,它跟golang设定的对象等级制度紧密关联;mspan结构体的核心字段:相同等级的mspan构成一条双向链表,所以mspan有前后指针; mspan管理整数倍的连续地址的页,所以有管理的内存起始地址,以及连续的页数; mspan的等级意味着它管理的块的大小,所以有一个标志等级的变量(1~67、以及0级处理大对象,等级用unit8来表示,高7位标识等级,最低位标识noscan信息,noscan用于标记当前mspan的内存需不需要在GC的时候进一步扫描,如果对象不包含指针,说明对象没有引用其他对象,那么垃圾回收的时候就不需要进一步扫描了。这样可以提高扫描效率); 分配内存时分配的其实是对应的槽位,所以有一个位图用来记录槽位,比如要分配31B的obj,那么就会向上到等级为32的mspan中根据它的位图找空闲的槽位(这是内部碎片的来源)。这个位图bitmap在后续的垃圾回收中也会使用到。 它的快速查找空闲槽用到了CTZ64算法
image.pngimage.png
image.png

mspan详解:既然相同size class的mspan节点聚集构成一条双向链表,所以mspan节点有next,pre指针,另外一个mspan管理的内存大小从startaddr开始,往后npages个page。当要分配obj的时候,会去alloccache记录的bitmap中去找为1的obj。 alloccache记录的bitmap就是记录obj的槽位
image.png
image.png

源码中核心的点: next、pre指针; startaddr; npages;alloccache(bitmap);spanclass(等级);freeindex(记录bitmap在某位之前的obj都被占用过了,加速找bitmap中Obj为1的槽位)
另外spanclass 是一个uint8 整数,高7位标识1~67+隐藏0级(处理更大对象) 共68个等级,最低位标识noscan信息。noscan标志是用来标记垃圾回收的时候需不需要扫描的标志位。
如果对象不包含指针,说明对象没有引用其他对象,那么垃圾回收的时候就不需要进一步扫描了。这样可以提高扫描效率

mcache

mcache是P的本地私有内存,在单个P内部是没有并发的,所以没有锁; 核心字段: alloc, mcache冗余了一些mspan,具体来说的话是两种,一种noscan类型的无需重复扫描,一种scan类型的。 另外mcache结构体中还有微型对象分配器(<16B)tinyalloc。
image.png
image.png

mcentral中心缓存

mcentral是相同等级mspan构成的两条链表,一条有空间,一条满空间,每个mcentral有一把锁,但是锁的粒度相比mheap更细;所以核心字段的话就是两条链表,一把锁,一个等级;

image.png
image.png

mheap

进程内全局唯一,访问加全局锁(因此对mheap的存取性能是非常可怕的),对于go上层来说mheap是操作系统虚拟内存的抽象,是go进程内部的内存之源,由于向操作系统申请内存这个操作很重,所以mheap一般一次申请比较大(64M)
mheap以8KB的页为最小内存单元,负责将连续的页组装成mspan,使用位图bitmap记录所有页的使用情况,为1说明页已经被mspan组装(不是被使用,组装了不一定使用了)(组装的时候找连续空闲页时为了加速,使用到了空闲页基数树索引辅助) 用heapArena聚合页记录页跟mspan的映射关系(GC的时候根据对象地址找到页是很简单的,但是mspan的记录对象使用情况的bitmap也需要更新,所以需要heapArena记录页跟mspan的映射关系,用来更新mspan的bitmap)。

分配过程

tiny微对象(<16B )的话,走mcache的微型分配器;
(<32KB的对象)优先从mcache中找对应等级mspan中的空槽(无锁),如果mcache兜不住就向上去mcentral;
根据等级去mcentral中的有空闲链表中找到mspan填充mcache(有锁),如果兜不住,继续向上去mheap;
mheap组装mspan填充到mcentral,然后从mspan中取内存(有锁),如果还兜不住,说明进程中没有足够的内存了,此时mheap会向操作系统申请内存(以heapArena为单位64MB);
0级别的大对象(>32KB),直接到mheap中

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

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

相关文章

HarmonyOS开发探索:父子组件手势绑定问题处理

场景一&#xff1a;父子组件同时绑定手势的冲突处理 效果图 方案 在默认情况下&#xff0c;手势事件为非冒泡事件&#xff0c;当父子组件绑定相同的手势时&#xff0c;父子组件绑定的手势事件会发生竞争&#xff0c;最多只有一个组件的手势事件能够获得响应&#xff0c;默认子…

二、基础—常用数据结构:列表、元祖、集合、字典、函数等(爬虫及数据可视化)

二、基础—常用数据结构&#xff1a;列表、元祖、集合、字典、函数等&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;字符串2&#xff0c;最常用的是列表&#xff08;重点掌握&#xff09;3&#xff0c;元组4&#xff0c;字典&#xff08;重要&#xff09;5&#xff0…

【CSS in Depth 2 精译】2.3 告别像素思维

当前内容所在位置 第一章 层叠、优先级与继承第二章 相对单位 2.1 相对单位的威力 2.1.1 响应式设计的兴起 2.2 em 与 rem 2.2.1 使用 em 定义字号2.2.2 使用 rem 设置字号 2.3 告别像素思维 ✔️2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 2.3 告别…

3D交互可视化编辑器求推荐,最好是针对企业级使用的?

企业级使用的3D交互可视化编辑器&#xff0c;支持编辑和调整2D、3D渲染及交互设置&#xff0c;以下几款可以关注了解一下&#xff1a; 1、Unity&#xff1a;一个广泛使用的跨平台游戏引擎&#xff0c;由Unity Technologies开发。支持开发者创建2D和3D游戏、交互式应用以及虚拟…

pdf压缩,pdf压缩在线网页版,在线压缩pdf网站

在数字化时代&#xff0c;pdf文件已经成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;pdf文件往往体积庞大&#xff0c;传输效率低下&#xff0c;还占用大量存储空间。如何在不影响文件质量的前提下&#xff0c;减小pdf文件的大小呢&#xff1f;今天&#xff0c…

74HC595芯片验证

目录 0x00 74595芯片简介0x01 实现原理 0x00 74595芯片简介 74595芯片有很多种封装&#xff0c;不管是贴片的还是直插式的&#xff0c;它们的引脚定义都如下图所示&#xff1a; 其中 &#xff1a; Q0-Q7为并行数据输出口&#xff0c;可以输出高低电平。OE 为使能引脚&#…

MySQL之高可用性和应用层优化(一)

高可用性 故障转移和故障恢复 在应用中处理故障转移 有时候让应用来处理故障转移会更加简单或者更加灵活。例如&#xff0c;如果应用遇到一个错误&#xff0c;这个错误外部观察者正常情况下是无法察觉的&#xff0c;例如关于数据库损坏的错误日志信息&#xff0c;那么应用可…

Hugging Face发布重量级版本:Transformer 4.42

Hugging Face 宣布发布Transformer 4.42&#xff0c;该版本为流行的机器学习库带来了许多新功能和增强功能。此版本引入了几个高级模型&#xff0c;支持新工具和检索增强生成 &#xff08;RAG&#xff09;&#xff0c;提供 GGUF 微调&#xff0c;并整合了量化的 KV 缓存&#x…

基于协同过滤的航空票务推荐系统的设计与实现(飞机票推荐系统)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Android Studio 解决AAPT: error: file failed to compile

1.找到项目下的build.gradle 2.在android语块中添加下面代码 aaptOptions.cruncherEnabled false aaptOptions.useNewCruncher false 12

【数据结构】栈和队列-相互实现OJ题

前言&#xff1a; 本题目是关于栈和队列的OJ题目&#xff0c;需对栈和队列有一定了解再进行做题&#xff0c;若不了解可以根据我之前这篇文章进行学习&#xff1a;【数据结构】栈和队列-CSDN博客,题中需要的栈和队列的实现也在该文章中有源代码 目录 前言&#xff1a; 一.用…

怎样将word默认Microsoft Office,而不是WPS

设置——>应用——>默认应用——>选择"word"——>将doc和docx都选择Microsoft Word即可

面试题-Spring家族与SpringIOC

1.spring家族的介绍 Spring简单图&#xff1a; 2.IOC原理 IOC就是原先代码里需要开发者实现对象的创建和关系依赖&#xff0c;反转交给SpringIOC容器管理对象的生命周期和对象之间的依赖关系。 依赖注入的方式&#xff1a; Setter&#xff1a;实现特定属性的public sette…

Evented PLEG: iSulad 稳态 CPU 利用率降低30%的关键特性

背景 容器技术在不断发展的过程中&#xff0c;已被广泛应用于多种场景。OpenAtom openEuler&#xff08;简称"openEuler"&#xff09; 社区容器引擎项目 iSulad[1]面向 CT、IT 领域的不同需求而生&#xff0c;它具有轻量级、高性能的特点&#xff0c;可以在资源受限…

高性能LDO电路设计,有配套文档

内容&#xff1a; 1、电路文件&#xff08;有仿真状态&#xff09;和PDK&#xff08;TSMC180&#xff09; 2、配套仿真结果文档讲解6页 3、参考资料三篇 指标&#xff1a; LDO 温度系数1.09ppm LDO 环路增益在 64.3dB&#xff0c;相位裕度在 66&#xff0c;系统稳定。 LDO 最大…

技术派Spring事件监听机制及原理

Spring事件监听机制是Spring框架中的一种重要技术&#xff0c;允许组件之间进行松耦合通信。通过使用事件监听机制&#xff0c;应用程序的各个组件可以在其他组件不直接引用的情况下&#xff0c;相互发送和接受消息。 需求 在技术派中有这样一个需求&#xff0c;当发布文章或…

ollama,springAi实现自然语言处理

ollama安装使用&#xff1a; https://ollama.com/ 下载速度比较慢的可以直接使用以下版本0.1.41 https://pan.baidu.com/s/1hCCkYvFjWqxvPyYA2-YElA?pwdotap 直接管理员身份双击安装&#xff0c;安装成功后会在任务栏里出现这个小图标&#xff1a; 打开cmd&#xff0c;输入…

WhatsApp:连接世界的即时通讯巨头

在数字化浪潮席卷全球的今天&#xff0c;即时通讯工具已成为人们日常生活中不可或缺的一部分。其中&#xff0c;WhatsApp凭借其卓越的功能、出色的用户体验和广泛的用户基础&#xff0c;在全球通讯领域崭露头角&#xff0c;成为连接世界的即时通讯巨头。今天将带您深入了解What…

tkinter显示图片

tkinter显示图片 效果代码解析打开和显示图像 代码 效果 代码解析 打开和显示图像 def open_image():file_path filedialog.askopenfilename(title"选择图片", filetypes(("PNG文件", "*.png"), ("JPEG文件", "*.jpg;*.jpeg&q…

数据资产赋能企业决策:通过精准的数据分析和洞察,构建高效的数据资产解决方案,为企业提供决策支持,助力企业实现精准营销、风险管理、产品创新等目标,提升企业竞争力

一、引言 在信息化和数字化飞速发展的今天&#xff0c;数据已成为企业最宝贵的资产之一。数据资产不仅包含了企业的基本信息&#xff0c;还蕴含了丰富的市场趋势、消费者行为和潜在商机。如何通过精准的数据分析和洞察&#xff0c;构建高效的数据资产解决方案&#xff0c;为企…