【go】内存分配模型

news2024/9/21 19:58:55

内存是怎么分配给对象的?
内存分配优化的地方是?
讲讲golang内存分配模型?

ans:
1.按照对象的大小分配:先算出对象的大小如果是tiny对象,就从tiny block中获取地址和偏移量,将对象打包到mcache;如果是16B以上32k以内就先从mcache获得对应class级别的span;如果mcache没有就从mcenter中获取,如果mcenter没有就创建一个mspan从free树或scav树中获得内存页。如果堆中没有就系统调用申请内存,后再扫描树。
2.优化的地方是使用了类似于tcmalloc模型,向每个p预分配2k的缓存减少系统分配的次数且mcahe是p私有的不用加锁操作;
3.将page组织进span作为内存管理的基本单位;mcache中根据page的页数范围不同class的span链表;mcenter作为缓存池存放不同class的两个span链表,一个链表叫empty不确定里面是否有空闲的对象空间,另一个是noempty所有span都至少有1个空闲的对象空间.mheap存放两个二查排序空闲已回收树,free树:空闲未垃圾回收。scav树:空闲已垃圾回收。

面对三连问,你是不是和我一样懵逼了?以下是我查询资料学习总结的知识体系,一起看下去吧🙀

1.存储的基本知识

计算机存储体系:
[图片]

cpu的运算速度很快,而其他的硬件速度慢,为了好好利用cpu的性能所以加入了高速缓存和层层缓存层。
引入虚拟缓存后,操作系统向进程屏蔽了物理物理,cpu查询内存如果高速cache没有命中就会查找页表从磁盘将物理内存加载进缓存更新页表映射。由于引入虚拟内存所以物理内存的并发访问问题的级别由进程级转为了多线程级别。

2.TCMalloc

2.1基础

学习内存先得了解两个内存区域:
栈内存:栈中的内存会自动回收,内存管理简单,分配快。
堆内存:堆上的内存需要手动分配和释放,浪费gc。
堆内存管理分为三个重要步骤:
分配内存、(使用内存)、回收内存、组织内存块
一个内存块中包含了:元数据、用户数据、对齐字段
分配:从堆中把内存分配出来,将信息存进内存块,将内存块组织为链表。
释放:从链表中的内存块取出标记为未使用。
分配顺序:从链表中获得未使用的内存块没有再从内存中分配。

2.2tcmalloc机制

引入TCmalloc
同一进程所有线程共享空间,为了更快的分配内存,为每个线程预分配一些内存,再申请小内存可以直接从缓存分配。因为只有一次系统调用且分配无需加锁,因此,可以达到快速分配的目的。
[图片]

内存管理的基本单位是page,一组连续的page被称为span,tcCache是线程级别的缓存,包含有不同级别的span链表,centralCache是所有线程共享的缓存包含不同级别的span只是访问需要加锁,pageHeap是堆内存的抽象保存若干span链表和large span set保存中大对象.
小对象的分配流程:ThreadCache -> CentralCache -> HeapPage,大部分时候,ThreadCache缓存都是足够的,不需要去访问CentralCache和HeapPage,无锁分配加无系统调用,分配效率是非常高的。
中对象分配流程:直接在PageHeap中选择适当的大小即可,128 Page的Span所保存的最大内存就是1MB。
大对象分配流程:从large span set选择合适数量的页面组成span,用来存储数据。

3.Go的内存管理与分配

[图片]

不同级别的内存管理对象:
page:8kb
span:内存管理的基本单位
mcahe:线程级别的缓存,无锁访问,mcache与p绑定
mcentral:线程共享的缓存,加锁访问,每个级别的span有有指针的链表和无指针的链表
mheap:从操作系统中分配的内存页按照span组织起来,组织形式是二叉排序树:
free树:空闲并未垃圾回收
scav:空闲已经垃圾回收
[图片]

小对象是在mcache中分配的,而大对象是直接从mheap分配的,从小对象的内存分配看起。
不同大小的对象内存分配:
小对象:

  1. 计算对象所需内存size
  2. Size class和是否需要指针获得span class
  3. 获取对应class级别的cspan
    a.mcache ->b. mcenteal ->c.mheap
    span内的所有内存块都被占用时,没有剩余空间继续分配对象,mcache会向mcentral申请1个span,mcache拿到span后继续分配对象。
    mcentral有两个链表。
  • nonempty:这个链表里的span,所有span都至少有1个空闲的对象空间。这些span是mcache释放span时加入到该链表的。
  • empty:这个链表里的span,所有的span都不确定里面是否有空闲的对象空间。当一个span交给mcache的时候,就会加入到empty链表。
    mcentral会先从nonempty搜索满足条件的span,如果没有找到再从emtpy搜索满足条件的span,然后把找到的span交给mcache。
    mcentral需要向mheap提供需要的内存页数和span class级别,然后它优先从free中搜索可用的span,如果没有找到,会从scav中搜索可用的span,如果还没有找到,它会向OS申请内存,再重新搜索2棵树,必然能找到span。如果找到的span比需求的span大,则把span进行分割成2个span,其中1个刚好是需求大小,把剩下的span再加入到free中去,然后设置需求span的基本信息,然后交给mcentral。
    大对象:
    99%的流程与mcentral向mheap申请内存的相同
    栈内存:每个goroutine都有自己的栈,栈的初始大小是2KB,100万的goroutine会占用2G,但goroutine的栈会在2KB不够用时自动扩容,当扩容为4KB的时候,百万goroutine会占用4GB。在rpc调用(grpc invoke)时,栈会发生扩容(runtime.morestack),也就意味着在读写routine内的任何rpc调用都会导致栈扩容, 占用的内存空间会扩大为原来的两倍,4kB的栈会变为8kB,100w的连接的内存占用会从8G扩大为16G(全双工,不考虑其他开销)
  1. 根据分配对象的大小,选用不同的结构做分配。包括 3 种情况:
    1. 小于 16B 的用 mcache 中的 tiny 分配器分配;
    2. 大于 32KB 的对象直接使用堆区分配;
    3. 16B 和 32KB 之间的对象用 mspan 分配。
  2. 现在我们假定分配对象大小在 16B 和 32KB 之间。在 mcache 中找到合适的 mspan 结构,如果找到了就直接用它给对象分配内存。
  3. 我们这里假定此时没有在 mcache 中找到合适的 mspan。需要到 mcentral 结构中查找到一个 mspan 结构并返回。虽然 mcentral 结构对 mspan 的大小和是否空闲进行了分类管理,但是它对所有的 P 都是共享的,所以每个 P 访问 mcentral 结构都要加锁。
  4. 假定 Go 运行时在进行了一些扫描回收操作之后,在 mcentral 结构还是没有找到合适的 mspan。Go 运行时就会建立一个新的 mspan,并找到 heapArea 分配相应的页面,把页面地址和数量写入 mspan 中。然后,把 mspan 插入 mcentral 结构中,返回的同时将 mspan 插入 mcache 中。最后用这个新的 mspan 分配对象,返回对象地址。
    微小对象分配:
    从tiny block中分配,这些对象被打包到线程本地缓存(mcache)中,在同一个内存块中存储多个 tiny 对象,从而减少碎片化和全局锁的争用。

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

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

相关文章

Xilinx系FPGA学习笔记(五)ROM的IP核学习

系列文章目录 文章目录 系列文章目录前言ROM IP分布式ROM生成ROM配置创建COE文件 块ROM生成如何快速生成Example Design 两种ROM对比 前言 最近在学习小梅哥的xilinx型FPGA开发板,一边学习一边记录,简化整理一下笔记 ROM IP 在 Memories &Storage …

JVM、JRE和 JDK:理解Java开发的三大核心组件

Java是一门跨平台的编程语言,它的成功离不开背后强大的运行环境与开发工具的支持。在Java的生态中,JVM(Java虚拟机)、JRE(Java运行时环境)和JDK(Java开发工具包)是三个至关重要的核心…

致远个性化之--获取明细表中相同类型的数据汇总,并赋值对应明细行中

需求 由于在近期的项目中,有预算、费用管控等需求,而且在报销填报时,费用明细项可能会有重复相同的费用类型发生多项,而相同的费用类型是多项时,要求按照汇总后的费用管控。 具体示例图如下: 邮寄费发生了两…

有希带你深入理解指针(4)

目录 前言🥰1.回调函数😺1.1回调函数的概念😋 2.qsort使用🤯2.1什么是qsort👻2.2 qsort函数的使用🧐 3.模拟实现qsort😎 前言🥰 本篇文章是对指针知识的进一步讲解,如果…

无人机飞手执照:模拟训练技术详解

随着无人机技术的飞速发展,其在航拍、农业、物流、救援等多个领域的应用日益广泛,对无人机飞手的技能与安全意识要求也随之提高。为了确保无人机操作的安全性与效率,获取无人机飞手执照成为专业从业者不可或缺的步骤。模拟训练作为执照考取过…

第一个搭建SpringBoot项目(连接mysql)

首先新建项目找到Spring Initializr 我使用的URL是https://start.spring.io这里最低的JDK版本是17,而且当网速不好的时候可能会显示超时,这里可以选用阿里云的镜像https://start.aliyun.com可以更快一些但是里面还是有一些区别的 我们这里选择Java语言&a…

【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换

1 图像的放大与缩小 2 图像的翻转 3 图像的旋转 4 仿射变换之图像平移 5 仿射变换之获取变换矩阵 6 透视变换 1 图像的放大与缩小 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) src: 要缩放的图片dsize: 缩放之后的图片大小, 元组和列表表示均可.dst: 可选参数, 缩…

AIGC大模型智能抠图(清除背景):Sanster/IOPaint,python(2)

AIGC大模型智能抠图(清除背景):Sanster/IOPaint,python(2) 在文章(1)的基础上,尝试用大模型扣除图中的某些主要景物。 1、首先,安装插件: pip i…

Qt项目使用Inno Setup打包(关于打包中文乱码的解决)

​ 关于打包好的文件乱码解决方法 打包好的文件中文乱码,就是编码格式出现了问题,更改一下中文脚本编码格式,在官网Inno Setup Translations下载好中文脚本 点击下载,然后另存为 得到ChineseSimplified.isl.txt文件后&#…

使用3DUNet训练自己的数据集(pytorch)— 医疗影像分割

代码:lee-zq/3DUNet-Pytorch: 3DUNet implemented with pytorch (github.com) 文章<cicek16miccai.pdf (uni-freiburg.de)3D U-Net: Learning Dense Volumetric Segmentation

贷款利率高低跟什么有关?仅凭身份证就能贷到款?额度是多少?

在金融的广阔舞台上&#xff0c;借款人的“信用基石”——即其综合资质&#xff0c;是决定贷款利率高低的决定性因素。这并非偶然&#xff0c;而是银行基于详尽的风险评估与收益预期所做出的精准判断。 需明确的是&#xff0c;贷款的易得性并不意味着无门槛的放任。它更像是设置…

【动手学深度学习】04 数据操作 + 数据预处理(个人向笔记)

数据操作 N维数组是机器学习和神经网络的主要数据结构其中 2-d 矩阵中每一行表示每一行表示一个样本 当维度来到三维的时候则可以表示成一张图片&#xff0c;再加一维就可以变成多张图片&#xff0c;再加一维则可以变成一个视频 访问元素 冒号表示从冒号左边的元素到冒号右…

巨魔商店2安装教程,支持最新iOS 17.0的所有型号

支持iOS15.0到16.6.1、16.7 RC (20H18)和17.0的所有iPhone/iPad。 工具下载地址&#xff1a; https://wwi.lanzoup.com/b0knd3q5g 密码:czhi Windows安装教程&#xff1a; 1&#xff0c;电脑必须安装ITunes&#xff0c;关闭查找我的 iPhone&#xff0c;手机上必须要有提示&…

python imshow报错怎么解决

实例如下所示&#xff1a; import matplotlib.pyplot as plt plt.imshow(img) #控制台打印出图像对象的信息&#xff0c;而图像没有显示 解决方法&#xff1a; #引入pylab解决 import matplotlib.pyplot as plt import pylab plt.imshow(img) pylab.show()

MES管理系统助力企业车间管理可视化

MES管理系统作为连接计划层与现场自动化系统的桥梁&#xff0c;在助力企业车间管理可视化方面发挥着重要作用。以下是MES管理系统如何助力企业车间管理可视化的详细阐述&#xff1a; 一、MES管理系统的概述 MES&#xff08;制造执行系统&#xff09;是一种用于生产车间的实时信…

点云数据常见的坐标系有哪些,如何进行转换?

文章目录 一、点云坐标系分类1. 世界坐标系2. 相机坐标系3. 极坐标系4. 笛卡尔坐标系(直角坐标系):5. 传感器坐标系6. 地理坐标系二、坐标系转换方法1. 地理坐标系与投影坐标系之间的转换2. 投影坐标系与局部坐标系之间的转换3. 局部坐标系与3D模型坐标系之间的转换4. 相机坐…

访问修饰符public、protected、private,基于C++

一、基本概念 公有&#xff08;public&#xff09;成员 公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值&#xff0c; 私有&#xff08;private&#xff09;成员 私有成员变量或函数在类的外部是不可访问的&#xff0c;甚至是不…

部落冲突:精通五个流派,部落战传奇杯横着走,但前提是能精通!

部落冲突&#xff1a;精通五个流派&#xff0c;部落战传奇杯横着走&#xff0c;但前提是能精通&#xff01; 在部落冲突当中有很多的流派&#xff0c;每个流派都有着属于自己的特点&#xff0c;但是速途同归的每个流派的最终目的都是用来打部落战和传奇杯&#xff0c;日常打资…

MAT:一款针对MSSQL服务器的安全检测与审计工具

关于MAT MAT是一款针对MSSQL服务器的安全检测与审计工具&#xff0c;该工具使用C#开发&#xff0c;可以帮助广大研究人员快速识别和发现MSSQL 服务器中的安全问题&#xff0c;并实现安全检测与审计目的。 功能介绍 1、执行自动检查并识别安全问题&#xff1b; 2、允许通过 Win…

驾驭冰雪 安全无忧,韩泰高性能冬季轮胎新品上市

- 韩泰轮胎推出冬季轮胎新产品Winter i*cept iZ3和SUV专用的Winter i*cept iZ3 X - 新轮胎采用了V型花纹&#xff0c;冰雪路面安全性极佳&#xff0c;而且具有操控性好、续航里程长的优点 - 新轮胎在位于北极圈以北300km的韩泰轮胎芬兰伊瓦洛测试场进行了严苛测试&#xff0c…