图解Golang的GC垃圾回收算法
作者:RyuGou 发布时间:2023-07-12 23:25:45
虽然Golang的GC自打一开始,就被人所诟病,但是经过这么多年的发展,Golang的GC已经改善了非常多,变得非常优秀了。
以下是Golang GC算法的里程碑:
v1.1 STW
v1.3 Mark STW, Sweep 并行
v1.5 三色标记法
v1.8 hybrid write barrier
经典的GC算法有三种: 引用计数(reference counting)
、 标记-清扫(mark & sweep)
、 复制收集(Copy and Collection)
。
Golang的GC算法主要是基于 标记-清扫(mark and sweep)
算法,并在此基础上做了改进。因此,在此主要介绍一下 标记-清扫(mark and sweep)算法
,关于 引用计数(reference counting)
和 复制收集(copy and collection)
可自行百度。
标记-清扫(Mark And Sweep)算法
此算法主要有两个主要的步骤:
标记(Mark phase)
清除(Sweep phase)
第一步,找出不可达的对象,然后做上标记。
第二步,回收标记好的对象。
操作非常简单,但是有一点需要额外注意: mark and sweep
算法在执行的时候,需要程序暂停!即 stop the world
。
也就是说,这段时间程序会卡在哪儿。故中文翻译成 卡顿
。
我们来看一下图解:
开始标记,程序暂停。程序和对象的此时关系是这样的:
然后开始标记,process找出它所有可达的对象,并做上标记。如下图所示:
标记完了之后,然后开始清除未标记的对象:
然后 垃圾
清除了,变成了下图这样。
最后,停止暂停,让程序继续跑。然后循环重复这个过程,直到 process
生命周期结束。
标记-清扫(Mark And Sweep)算法存在什么问题?
标记-清扫(Mark And Sweep)算法
这种算法虽然非常的简单,但是还存在一些问题:
STW,stop the world;让程序暂停,程序出现卡顿。
标记需要扫描整个heap
清除数据会产生heap碎片
这里面最重要的问题就是:mark-and-sweep 算法会暂停整个整个程序。
Go是如何面对并这个问题的呢?
三色并发标记法
我们先来看看Golang的三色标记法的大体流程。
首先:程序创建的对象都标记为白色。
gc开始:扫描所有可到达的对象,标记为灰色
从灰色对象中找到其引用对象标记为灰色,把灰色对象本身标记为黑色
监视对象中的内存修改,并持续上一步的操作,直到灰色标记的对象不存在
此时,gc回收白色对象。
最后,将所有黑色对象变为白色,并重复以上所有过程。
来源:https://juejin.im/post/5c8525666fb9a049ea39c3e6
猜你喜欢
- 本文实例讲述了PHP调用全国天气预报数据接口查询天气。分享给大家供大家参考,具体如下:基于PHP的聚合数据全国天气预报API服务请求的代码样
- 显示下级的方法elementui的节点过滤默认是不显示下级的代码在 :filter-node-method="filterNode
- 1、方法一在点击的时候记录滚动条位置,存入本地再次进入该路由读取滚动跳位置1、1 跳转时路由存入scroll 如果要有多个页面,可以把名称也
- 1. 修改pip install默认安装路径一般使用Anaconda时会使用pip install ###来安装各类包,但默认安装路径在C盘
- 一、高级异常回顾异常相关的语句:try-except:用来捕获异常的通知try-finally:用来做一定要做的事reise:用来发生异常通
- 本文介绍了jquery在vue脚手架中的使用方式示例,分享给大家,具体如下:1:在各个vue文件中使用<script>impor
- 我们都知道代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句
- 首先 编辑views.py文件每个响应对应一个函数 函数必须返回一个响应函数必须存在一个参数 一般约定为request每个响应函数 对应一个
- 写了个小程序:功能1.测试远程ssh连接是否成功,2.批量执行远程ssh命令效果如下:代码如下:#-*- coding:utf-8 -*-i
- python的numpy库提供矩阵运算的功能,因此我们在需要矩阵运算的时候,需要导入numpy的包。一、numpy的导入和使用from&nb
- 如何自动更新导航栏?下面看看如何具体使用Content Linking组件: <&nbs
- 作者:AngelGavin 出处:CSDN一般问题什么是 XML?可扩展标记语言 (XML) 是 Web 上的数据通用语言。它使
- 最近在网上经常看到朋友们聊到UEO,我就想哈UEO是啥东西啊,我去找啦些资料看,他们都说将来UEO发展一定会比较好,我也说这是肯定的.我为什
- 前言本文主要给大家介绍了关于Python3用SMTP协议发送电子邮件的相关内容,在介绍如何使用python程序向指定邮箱发送邮件之前,我们需
- CSS执行顺序与优先权的问题其实就是一个冲突解决的问题,当同一个元素(或内容)被CSS选择符选中时,就要按照优先权取舍不同的CSS规则,这其
- K线数据提取依据原有数据集格式,按要求生成新表:1、每分钟的close数据的第一条、最后一条、最大值及最小值,2、每分钟vol数据的增长量(
- 1、互动流通的活跃度是社区网站的关键,产品设计者大都需要在此猛下药。facebook有利用率最高的minifeed,myspace有“好友的
- 八卦为先八卦是种优良品质,特别是用在技术上时。来看几个Reset CSS的八卦问题吧:你知道世界上第一份reset.css在哪么?* { m
- Mysql慢查询解释MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过
- 下文要实现的可视化大屏内容:需要在地图上将我司船舶的轨迹展示出来。听起来很简单,一开始我也是这样想的。通过一些BI工具应该可以轻松实现,比如