首页 > 编程语言 >Golang GC是标记清除GC算法吗?与复制算法、标记整理算法的区别

Golang GC是标记清除GC算法吗?与复制算法、标记整理算法的区别

时间:2023-12-07 10:05:07浏览次数:25  
标签:标记 对象 清除 回收 算法 GC 内存


Golang(Go语言)使用的是标记清除(Mark and Sweep)的垃圾回收(GC)算法。

下面是标记清除算法与复制算法以及标记整理算法之间的区别和优势:

  1. 标记清除算法(Mark and Sweep):
  • 工作原理:标记清除算法分为标记和清除两个阶段。首先,从根对象(如全局变量、堆栈中的对象)开始,标记所有可以访问到的对象。然后,在清除阶段,遍历堆中的所有对象,清除未被标记的对象,并回收其内存空间。
  • 优势:标记清除算法可以处理不规则的内存布局,即对象之间的引用关系可以是任意的。它可以有效地回收不再使用的内存,并且不会产生额外的内存拷贝开销。
  1. 复制算法(Copying):
  • 工作原理:复制算法将堆内存分为两个大小相等的区域(通常称为"from"和"to")。在分配新对象时,将存活的对象复制到未使用的区域中,并按照顺序排列。然后,将已使用的区域全部释放。这样,已使用的内存空间总是连续的,不会产生内存碎片。
  • 优势:复制算法具有简单高效的特点,适用于存活对象较少的情况。它可以快速回收大部分的垃圾对象,并且不会产生内存碎片。
  1. 标记整理算法(Mark and Compact):
  • 工作原理:标记整理算法结合了标记清除和复制算法的优点。它首先使用标记阶段标记所有可访问的对象,然后将存活的对象移动到一端,然后进行内存整理,将所有存活对象紧凑排列。
  • 优势:标记整理算法可以解决标记清除算法的内存碎片问题,同时也避免了复制算法的内存浪费。它可以高效地回收垃圾对象,并且产生较少的内存碎片。

Golang选择了标记清除算法作为其垃圾回收算法,这是因为标记清除算法能够处理不规则的内存布局,并且可以高效地回收不再使用的内存。同时,Golang的标记清除算法还使用了并发扫描和压缩技术,以减少垃圾回收对应用程序的影响。

总结起来,标记清除算法是一种灵活且高效的垃圾回收算法,适用于处理动态分配的内存和不规则的对象引用关系。它是Golang在垃圾回收方面的选择,以提供高性能和可伸缩性的语言特性。


标签:标记,对象,清除,回收,算法,GC,内存
From: https://blog.51cto.com/zhangxueliang/8718164

相关文章

  • 【视频】Copula算法原理和R语言股市收益率相依性可视化分析|附代码数据
    阅读全文:http://tecdat.cn/?p=6193最近我们被客户要求撰写关于Copula的研究报告,包括一些图形和统计输出。copula是将多变量分布函数与其边缘分布函数耦合的函数,通常称为边缘。在本视频中,我们通过可视化的方式直观地介绍了Copula函数,并通过R软件应用于金融时间序列数据来理解它......
  • LR语法分析算法
    LR语法分析器组成:一个输入,一个输出,状态栈,驱动程序,语法分析表注意:规约后需要寻找新的符号在栈顶状态上的转换例如:状态栈  符号栈    输入05    $id       *id$      此时需要按F->id规约03    $F      ......
  • 算法随笔——分块
    介绍分块的基本思想是通过适当的划分和预处理,用空间换时间,更加接近朴素算法,是一种暴力数据结构。例题1例如最经典的区间修改区间查询,若用树状数组来做就显得过于麻烦了。而用线段树做这道题,虽然通用,但马亮比较大,非常不友好。于是一种\(O(nlogn)\)的解法出现了——分块。思路......
  • 简述LVS的工作模式和调度算法
    工作模式:NAT,TUNNEL,DR,FULLNAT算法说明rr轮询调度(Round-Robin),它将请求依次分配不同的RS节点,也就是在RS节点中均摊请求。这种算法简答,但是只适合于RS节点处理性能相差不大的情况wrr加权轮询调度(Weighted Round-Robin)它将依据不同RS节点的权值分配任务。权值较高的RS将优先获得任务,并......
  • 代码随想录算法训练营第七天| 344.反转字符串 541. 反转字符串II
    LeetCode344.反转字符串题目链接: LeetCode344思路: 定义left、right指针,将两指针对应的值反转即可 classSolution{public:voidreverseString(vector<char>&s){intn=s.size();for(intleft=0,right=n-1;left<right;++left,--right){......
  • 【Python】【OpenCV】凸轮廓和Douglas-Peucker算法
    针对遇到的各种复杂形状的主体,大多情况下,我们可以求得一个近似的多边形来简化视觉图像处理,因为多边形是由直线组成的,这样就可以准确的划分区域来便捷后续的操作。 cv2.arcLength()Method:参数:curve:要计算周长的轮廓,可以是一个矩形、圆形、多边形等封闭曲线。closed:一个布尔......
  • 双边滤波算法
      H:\CodeSet\vcg完善1\pclPrj\bilateralFunc.h//双边滤波算法floatsigma_s_=0.5;floatsigma_r_=0.5;pcl::PointCloud<pcl::PointXYZ>::PtrplcCloud1;PointCloud<pcl::Normal>::Ptrcloud_normals;doublekernel(doublex,doublesigma){retur......
  • 【数据结构和算法】搜索算法
    ①搜索最小值python的min函数返回列表中的最小项1defindexOfMin(lyst):2minIndex=03currentIndex=14whilecurrentIndex<len(lyst):5iflyst[currentIndex]<lyst[minIndex]:6minIndex=currentIndex7currentI......
  • 【数据结构和算法】排序算法
    使用swap函数来交换列表中的两项的位置1defswap(lyst,i,j):2'''交换列表中两项的位置'''3temp=lyst[i]4lyst[i]=lyst[j]5lyst[j]=temp①选择排序处于列表第一项,先找到最小项的位置,如果该位置不是列表的第一项,算法会交换这两个位置的项,然后......
  • 路径规划算法 - 求解最短路径 - Dijkstra算法
    Dijkstra算法的思想是广度优先搜索(BFS)贪心策略。是从一个顶点到其余各顶点的最短路径算法,节点边是不各自不同的权重,但都必须是正数如果是负数,则需要Bellman-Ford算法如果想求任意两点之间的距离,就需要用Floyd算法求节点0->4的最短路径每次从未标记的节点中选择距离......