首页 > 系统相关 >内存分配

内存分配

时间:2023-11-04 18:12:18浏览次数:33  
标签:mspan 对象 mcentral mcache 内存 67 分配

arena

这块区域最大,明显就是用来存放我们最终的对象,里面分成了一个个8K大小的房间,每个房间我们称为page。(这里虽然写了它是512G,但是你心里要有B数,你电脑根本没这么大的内存,其实操作系统只是给了你地址而已)同时几个page组合在一起的大房间又叫做mspan(这个是golang中内存管理的基本单元)

bitmap

然后我们再来看第二大的bitmap,它是用来表示arena中存放的对象的一些信息,包括这个对象GC标志,还有标识这个对象是否包含指针。你肯定就好奇,干嘛要有这个呢?这其实也很好理解,golang在进行垃圾回收的时候是根据引用的可达性分析来确定一个对象是否可以被回收,同时采用的是三色标记法进行标记对象,所以这里需要有bitmap来保存这些信息。(具体如果不清楚垃圾回收的细节可以去看看我之前写的有关垃圾回收的部分)

spans

最后是spans,这里保存了mspan的指针,这个也好理解,为了方便管理那一个个大房间嘛

 

mspan是堆上内存管理的基本单元,由一连串的页构成(8kb)。golang根据内存大小将mspan分成了67个等级,每个mspan被切分成了很多小的对象,用于不对尺度 的对象分配。

每个线程有一个独立的堆内存mcache,在mcache上申请内存不需要加锁,每个mache有67种尺度内存单元,每个尺度的内存又由2个mspan构成,分别存储指针类型和非指针类型。当程序在堆上创建对象时,分配器会根据对象的大小(小于32kb)和类型(是否为指针)从67*2种mspan中分配内存。

如果mache内存不足,会从所有线程共享的缓存mcentral中申请内存。一共有67*2种mcentral, mcache中空间不足的mspan会从对应的mcentral申请内存,申请内存时需要加锁,但是加锁的概率变成了1/(67*2),申请效率很高。为了进一步提升内存分配效率,每一个mcentral由2个链表构成,一个存储已经分配给mcache的mspan,一个存放未被占用或者已经被mcache释放的mspan。

当mcentral上mspan不足时或者对象大于32kb时会从mheap上申请内存,全局仅有一个mheap,也需要加锁访问。mspan中有2棵二叉排序树(根据mpan中的page数量):free,scav,free存放的是空闲非垃圾回收的mspan,scav存放的是空闲已经垃圾回收的mspan。内存分配时优先从free中搜索可用的span,如果没有找到,会从scav中搜索可用的span,如果还没有找到,它会向OS申请内存,再重新搜索2棵树,必然能找到span。从OS申请的也会被保存到span中,然后加入free树中。

标签:mspan,对象,mcentral,mcache,内存,67,分配
From: https://www.cnblogs.com/jianzhaojing/p/17809624.html

相关文章

  • 对象内存图的过程
     单一对象1.由于TestStudent中含有main方法,因此TestStudent类先以字节码形式进入方法区,里面包含main方法2.虚拟机调用该类中的main方法,main方法进入栈内存中3.main方法中先创建对象stu,调用了student类,Student类字节码文件进入方法区4.创建了对象stu,在堆内存中开辟对象stu......
  • JavaScript内存管理
    在使用垃圾回收的编程环境中,开发者通常无须关心内存管理。不过,JavaScript运行在一个内存管理与垃圾回收都很特殊的环境。分配给浏览器的内存通常比分配给桌面软件的要少很多,分配给移动浏览器的就更少了。这更多出于安全考虑而不是别的,就是为了避免运行大量JavaScript的网页耗......
  • 云服务器的CPU利用率,外网出带宽使用率,内存利用率,磁盘利用率
    云服务器的CPU利用率、外网出带宽使用率、内存利用率和磁盘利用率是用于监测服务器性能和资源使用情况的关键指标,它们各自代表不同方面的服务器运行状态:CPU利用率:CPU(中央处理单元)利用率表示服务器的处理器单元的使用情况。它表示服务器上正在运行的进程或任务对CPU资源的占用程度......
  • 全网首发 Python3 实现快读(按字符读入(省内存专用
    全网首发Python3实现快读(按字符读入(省内存专用来源:https://www.luogu.com.cn/discuss/724761此题卡内存,如果按照Python常用的input().split()方法会MLE。因为input()一次读入大量字符串,占用内存极大。于是打算按照C++的快读逻辑写一个Python3的快读。然而并没有......
  • linux使用top命令java进程占用65%内存和160%CPU,是因为什么咋解决?
    Java进程占用大量内存和CPU的原因可能有多种,以下是一些可能的原因和解决方法:内存泄漏:Java应用程序可能存在内存泄漏,即未正确释放不再使用的内存。您可以使用Java内存分析工具(如VisualVM、MAT等)来检测和分析应用程序的内存使用情况,并查找潜在的内存泄漏问题。一旦发现内存泄漏,您可以......
  • 浅析C++中浮点数在内存中的存储方式
    1.任何数据在内存中都是以二进制的形式进行存储。例如,short型数据1156,由于在32位机和64位机都占2B一共16位其二进制形式为:0000010010000100。在IntelCPU架构的系统中(目前用的最多的硬件架构系统),存放方式为10000100(低地址单元)00000100(高地址单元),因为IntelCPU的......
  • 去库存化进入尾声,内存模组厂加速复苏 | 百能云芯
    近期,半导体市场开始传递复苏信号,国内大型半导体制造商纷纷提到明年将迎来多款消费性电子产品的需求回升,这表明半导体设计库存的去化即将进入尾声。另一个重要的迹象是内存市场,自去年以来,国外许多记忆体制造商面临价格大幅下滑,采取了大规模减产措施,但市场价格近期开始止跌回稳。此外......
  • JAVA内存分配
    1.类(包含该类的方法)的字节码文件进入方法区处于候命状态2.虚拟机调用了该类的方法后,方法进入栈内存,并执行方法3.当运行方法过程中出现了“new”,就会在堆内存中开辟对应空间,并把该空间的地址返回给arr变量记录,因此就可以通过arr找到对应的堆内存空间 注意: ......
  • 项目管理之如何分配项目工作任务
    项目资源配置技术是项目管理中至关重要的环节,它直接影响到项目的效率、质量以及最终的成果。本文将介绍项目资源配置技术,包括小组团队主管配置、保持团队规模小型化、保持团队人员能力均衡、为保证团队速度及质量,团队资源复用数量限制以及资源实践损耗等方面。同时,本文还将介绍RACI......
  • 项目管理之如何分配项目工作任务
    项目资源配置技术是项目管理中至关重要的环节,它直接影响到项目的效率、质量以及最终的成果。本文将介绍项目资源配置技术,包括小组团队主管配置、保持团队规模小型化、保持团队人员能力均衡、为保证团队速度及质量,团队资源复用数量限制以及资源实践损耗等方面。同时,本文还将介绍RACI......