首页 > 编程语言 >GC的算法和实现理解

GC的算法和实现理解

时间:2023-11-01 12:12:08浏览次数:30  
标签:head 对象 -- mutator 算法 理解 gc GC

对于垃圾回收回收的基本概念

基本单元:

对象(个体基础单元)包括两个部分。head(头),field(域)。

head里核心内容:对象大小,对象种类。

field里主要分两种:指针,非指针。

 

mutator某种意义上就是实体应用本身,主要进行两个事情创建对象,更新指针。(gc就是为他擦屁股的,帮他处理不需要的遗留)

一个动态的存放对象的内存空间。当一个当mutator需要把产生的对象申请往堆里存放,gc会管理这些被丢进堆里的对象,当堆达到最大的时候,gc就会启动,清理出空间让对象能就被继续放入(条件允许我们一般是扩大内存)。

活动对象/非活动对象,可以说是否被mutator引用的对象就是活动对象,非活动对象就是相反的(也就是垃圾)。

提问:死掉的对象可以活过来吗?

分配allocater),当mutator需要一个新对象的时候,向allocater会申请一个大小合适的空间,allocater会从堆的空间寻找一个足够空间返回给mutator。

堆被所有活动空间占满,无法分配出空间一般会有两种操作:1扩大分配的内存。2直接销毁当前结果,抛出异常日志打出错误信息。

 我总结了一下这个流程大致是如此(如若不对请斧正):

应用(mutator)--产生对象--》分配(allocater)--申请空间--》堆

分块chunk)这是一个有趣的东西,初始化时候整个应用的内存空间(堆)就是一个大大大的快,有点像一个蛋糕,需要多少就从这里切一点。然后不需要的(垃圾)又会被销毁又会被回收拿回来继续分块。

提问:被分块的部分可以被继续被分块吗?

根(root) 再整个gc的世界,根是所有对象的起点。(gc也是无法严谨判断指针和非空指针的)通过mutator直接引用调用栈(call stack)和寄存器。也就是说,调用栈、寄存器以及全局变量空间都是根。

 

 

提问:一般的根会有哪些?

一般对gc评价一本从以下四个方面· 吞吐量· 最大暂停时间· 堆使用效率· 访问的局部性。

如图:

吞吐量 = headsize/a+b+c    也就是堆大小除以gc总耗时。

最大暂停时间,也就是abc中的最大值,处于gc的时候他是没法做其他事情的,就好像吃饭你总要去咀嚼吞咽,不能持续喂饭的操作。这就需要等上一口吃完。这种事情就像浏览器在等待响应一样的。

堆使用效率,有两个决定性因素,一个是头(head越小越好),一个是堆的用法(不同的gc算法会有影响,类如复制算法和标记清除就会存在各自差异,辅助算法会把head分成两个部分一部分用一部分做出调整,标记清除适用范围就是整个head

访问的局部性,下面这个图就代表了存储空间内的相互局部性。

 

一般使用效率高,吞吐量就上不去,不可兼得,简单地说就是:可用的堆越大,GC运行越快;相反,越想有效地利用有限的堆,GC花费的时间就越长(因为频繁的gc)。

 

 

 

(答案评论区,为了防止放弃思考我丢下面去了。。。)

 

标签:head,对象,--,mutator,算法,理解,gc,GC
From: https://www.cnblogs.com/badfisher/p/17802664.html

相关文章

  • 11.1算法
    递增的三元子序列给你一个整数数组 nums,判断这个数组中是否存在长度为3的递增子序列。如果存在这样的三元组下标(i,j,k) 且满足i<j<k,使得 nums[i]<nums[j]<nums[k],返回true;否则,返回false。 示例1:输入:nums=[1,2,3,4,5]输出:true解释:任何i<j<k......
  • CGCDSSQ
    妙蛙种子。CGCDSSQ首先,如果一个数\(x\)的因数\(y\)要么是自己,要么\(y\le\frac{x}{2}\)。假设\(y\neqx\),\(y>\frac{x}{2}\)。\[\frac{x}{y}<2,y|x,\frac{x}{y}=1,x=y\]矛盾。懒得写了,看题解就想起来了……......
  • R语言实现MCMC中的Metropolis–Hastings算法与吉布斯采样|附代码数据
     最近我们被客户要求撰写关于MCMC的研究报告,包括一些图形和统计输出。创建测试数据第一步,我们创建一些测试数据,用来拟合我们的模型。我们假设预测变量和因变量之间存在线性关系,所以我们用线性模型并添加一些噪音。  trueA<-5trueB<-0trueSd<-10sampleSize<-31......
  • Python学习笔记(一)蒙特卡罗算法求圆周率π
    绪论\(\pi\)(圆周率)是数学和物理学普遍存在的常数之一,可以被定义为圆周长和直径之比或者圆的面积与半径平方之比(\(l=2\pir\)和\(S=\pir^2\))。\(\pi\)是一个无理数,下面将用蒙特卡罗算法求\(\pi\)的数值近似。要求1.要求能算到小数点后面越多越好‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫......
  • 关于二叉树中三种深度遍历方式的理解
    今日刷题,538.把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。问题主要还是在于递归返回值的处理上:在中序遍历的情况下,似乎对于左右两个节点的遍历,不......
  • 网关添加请求头的正确理解
    网关上的请求头和响应头当您通过MSE网关将请求转发到后端服务时,在网关中添加的请求头(例如"hello")会在到达后端服务时一并发送给后端服务。您可以在后端服务中通过请求头获取该值。当您在MSE网关中添加响应头(例如"good"),该响应头会在后端服务完成响应之后,由MSE网关添加到响......
  • 贪心算法之找零钱
    defgreedy_change(amount,coins):coins.sort(reverse=True)#将硬币按面额从大到小排序change=[]forcoinincoins:whileamount>=coin:amount-=coinchange.append(coin)#将硬币加入到找零列表中returnch......
  • 算法常见题型
    1.跳跃问题(贪心):给定一个非负整数数组,初始位于第一个位置,输出调到最后一个位置的最短步数,跳不出来则输出-1。letnums=[4,3,1,0,2,2,3,2,0,4]console.log(jumpStep(nums))functionjumpStep(nums){letsteps=0,startIndex=0,endIndex=nums[0]letlen=......
  • WOA-CNN基于鲸鱼算法优化卷积神经网络的多变量回归预测 可直接运行 注释清晰适合新手
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • GJO-LSTM-Adaboost基于金豺算法优化长短期记忆神经网络LSTM的Adaboost分类预测
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......