【Go进阶训练营】聊一下go的gc原理
背景
正好周末时间,就打算梳理以下自己对go gc的理解。跳出语言层面来说,gc分为两种,一种是手动创建,手动销毁。另一种就是由自动分配自动销毁,前者就是c,c++的代表,后者就是java,go。
而整个流程来说的话,程序运行->内存分配->垃圾回收,至于内存分配,这个我留到下一篇来讲解梳理以下。
其中内存分配需要依靠内存分配器,而垃圾回收需要垃圾回收器,垃圾回收器有不同的垃圾回收算法。
垃圾回收算法
- 引用技术算法。主要是在程序启动后,每个对象初始标记为0,如果有别的对象引用该对象,那么引用技术就+1,但是存在一个问题就是循环引用的问题。这个和java中的类似。
- (追踪式垃圾回收)可达性分析算法,初始标记一些root对象,根据这些root对象 递归遍历,如果可达的话,那么就标记为可用,否则剩余对象就是可以被清除的对象。
Go 现在用的三色标记法就属于追踪式垃圾回收算法的一种。
根对象
根对象在垃圾回收的术语中又叫做根集合,它是垃圾回收器在标记过程时最先检查的对象,包括:
全局变量:程序在编译期就能确定的那些存在于程序整个生命周期的变量。
执行栈:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。
寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。
在GC的标记阶段首先需要标记的就是"根对象", 从根对象开始可到达的所有对象都会被认为是存活的。
根对象包含了全局变量, 各个G的栈上的变量等, GC会先扫描根对象然后再扫描根对象可到达的所有对象。
Mark & Sweep
- STW(Stop the World): 需要暂停Mutatur,来确定所有的引用关系,而这部分也就是优化GC的重点,因为STW对于系统的吞吐量来说是非常致命的,所以有些业务场景下是不可接受的。
- Mark & Sweep :该过程就是先STW,然后用root 根对象去标记可达的对象,先标记后清除,如下图,先通过根对象标记到A B C D G,然后清除掉E F。
go 1.1 GC流程
- Stop the World
- Mark:通过 Root 和 Root 直接间接访问到的对象, 来寻找所有可达的对象,并进行标记。
- Sweep:对堆对象迭代,已标记的对象置位标记。所有未标记的对象加入freelist, 可用于再分配。
- Start the Wrold
总结:先停止程序,然后标记 清除,然后在程序正常运行。其实缺点非常明显,这种对业务影响是非常大的,分配内存慢,内存碎片高。
go 1.3 gc流程
我们分析一下,其实在清除阶段,只要不去干扰对象引用关系,其实不会对最终清除的对象有影响。所以mark阶段可以STW,Sweep阶段可以并发执行。所以1.3的流程就是 mark阶段STW,并发Sweep。从一定程度上可以减少STW对程序业务的影响。
go 1.5 gc (三色标记法)
1.5版本在标记过程中使用三色标记法。标记和清扫都并发执行的,但标记阶段的前后需要 STW 一定时间来做 GC 的准备工作和栈的re-scan。
什么是三色标记?
三色标记是对标记清除法的改进,标记清除法在整个执行时要求长时间 STW,Go 从1.5版本开始改为三色标记法,初始将所有内存标记为白色,然后将 roots 加入待扫描队列(进入队列即被视为变成灰色),然后使用并发 goroutine 扫描队列中的指针,如果指针还引用了其他指针,那么被引用的也进入队列,被扫描的对象视为黑色。
白色对象:潜在的垃圾,其内存可能会被垃圾收集器回收。
黑色对象:活跃的对象,包括不存在任何引用外部指针的对象以及从根对象可达的对象,垃圾回收器不会扫描这些对象的子对象。
灰色对象 :活跃的对象,因为存在指向白色对象的外部指针,垃圾收集器会扫描这些对象的子对象。
其实直接看图的话,可以非常明显的明白,初始为白色,然后将root可达的对象标记为灰色,如果这个对象被被的对象引用那么标记为黑色,到最后如果不可达对象 必定是白色,那么可以被清除。
写屏障和删屏障
1.5版本在标记过程中使用三色标记法。回收过程主要有四个阶段,其中,标记和清扫都并发执行的,但标记阶段的前后需要 STW 一定时间来做GC 的准备工作和栈的 re-scan。
使用并发的垃圾回收,也就是多个 Mutator 与 Mark 并发执行,想要在并发或者增量的标记算法中保证正确性,我们需要达成以下两种三色不变性(Tri-color invariant)中的任意一种:
强三色不变性:黑色对象不会指向白色对象,只会指向灰色对象或者黑色对象。
弱三色不变性 :黑色对象指向的白色对象必须包含一条从灰色对象经由多个白色对象的可达路径。
总结:其实本上强三色和弱三色 主要就是为了保证在系统和标记对象的过程中,不会造成对对象引用关系链造成影响。
写屏障
写屏障的目的其实为了保证在系统执行和标记对象并发执行的之后,保证系统的正确性。
writePointer(slot, ptr):shade(ptr)*slot = ptr
写屏障保证在将黑色对象对象引用到白色对象时,(这个时候不满足强三色规则)会将白色对象标记为灰色对象,满足强三色规则。如下图中,A对象引用到C,将C对象标记为灰色,然后A可达C,所以A C D设置为黑色。
问题:虽然写屏障可以保证强三色不变式,但是Go中仅针对堆上的对象进行写屏障,而栈中对象写屏障是比较耗费性能的,所以要么通过栈上写屏障保证或者通过STW来重新扫描保证对象变黑来保证。
删屏障
删除屏障也是拦截写操作的,但是是通过保护灰色对象到白色对象的路径不会断来实现的。也就是若三色不变式。
writePointer(slot, ptr):if (isGery(slot) || isWhite(slot))shade(*slot)*slot = ptr
混合屏障
插入写屏障和删除写屏障的短板:
插入写屏障:结束时需要STW来重新扫描栈,标记栈上引用的白色对象的存活;
删除写屏障:回收精度低,GC开始时STW扫描堆栈来记录初始快照,这个过程会保护开始时刻的所有存活对象。
具体操作:
1、GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW);
2、GC期间,任何在栈上创建的新对象,均为黑色;
3、被删除的对象标记为灰色;
4、被添加的对象标记为灰色;
总结
1.GC的过程 标记清除,但是关键点在于对STW的合理配合下不影响系统的正常运行,由此引入写屏障和删屏障操作来保证强三色和弱三色规则,但是本上他们存在一定的问题,所以使用混合屏障来保证。
引用
https://www.cnblogs.com/ricklz/p/14155443.html
相关文章:
【Go进阶训练营】聊一下go的gc原理
背景 正好周末时间,就打算梳理以下自己对go gc的理解。跳出语言层面来说,gc分为两种,一种是手动创建,手动销毁。另一种就是由自动分配自动销毁,前者就是c,c的代表,后者就是java,go。 而整个流程…...
英飞凌Tricore原理及应用介绍05_中断处理之中断路由(IR)模块详解
目录 1.概述1.1相关缩写2 TC3xx中IR特性介绍3.SRN(中断服务请求优先级)3.1 寄存器中的各Bit位讲解3.2 如何改变SRN配置4. 实际应用介绍4.1 如何利用SRC寄存器检查OS中断配置是否正确?1.概述 在Tricore架构中允许有多个中断源包括片上外设及外部中断世间产生的中断请求,以打…...
微搭问答002-移动端上传的文件如何在PC端下载
遇到一个问题,就是上传的图片,在手机上可以下载了,但在电脑上怎么下载到电脑 里,包括上传的文件 点击查看页面就可以吧,在企业工作台里 我做了查看页面,小程序可以,但H5和电脑页面不行 你创建一…...
初识JVM
目录 引言 JVM是什么? JVM和java有什么联系? JDK、JRE、JVM有什么区别 为什么学习JVM? JVM——从内存管理开始 运行时数据区域 分区讲解 堆 方法区 程序计数器 本地技术栈 虚拟机栈 对象的创建 指针碰撞: 空闲列表…...
实践分享:Vue 项目如何迁移小程序
最近我们小组刚经历了将成熟的 HTML5 项目转换成小程序,并在app中运行的操作!记录下来分享给各位。 项目:将已有的 Vue 项目转为小程序, 在集成了FinClip SDK 的 App 中运行。 技术:uni-app、FinClip 两个注意事项&…...
JavaScript学习笔记(6.0)
JavaScript类 使用关键字class创建类。 始终添加constructor()方法 class ClassName{constructor(){...} } calss Car{constructor(name,year){this.namename;this.yearyear; } } 创建了一个名为Car的类,并且拥有两个初始属性name和year。 JavaScript类不是对…...
某小公司面试记录
记录一次面试过程,还有一些笔试题,挺简单的,排序,去重,this指向,深浅拷贝,微任务的执行顺序,变量提升等。 ES6数组新增的方法 Array.from: 将两类对象转为真正的数组&am…...
SPI读写SD卡速度有多快?
SD卡是一个嵌入式中非常常用的外设,可以用于存储一些大容量的数据。但用单片机读写SD卡速度一般都有限(对于高速SD卡,主要是受限于单片机本身的接口速度),在高速、实时数据存储时可能会有影响。但具体速度可以达到多少…...
MySQL:索引与事物
目录 简单了解索引的底层数据结构 索引的概念: 索引存在的意义: 索引的使用: 索引实现的数据结构 B树 B 树 B 树的特点 B 树的优势 事物 事物的概念 事物的使用 事物的四大特性 并发可能引起的问题 脏读问题 不可重复读 幻读…...
mybatis实战
目录配置自动下划线驼峰MyBatis解析的SQL和实际传参不符的问题传参是整型,结果是false日期比较入参是字符串入参是Date父子递归查询上下级查询方法一方法二传参数组inmapper中接口注解映射配置 自动下划线驼峰 使用mybatis的自动下划线驼峰转换 mybatis有一个选项…...
【UEFI实战】BIOS与IPMI
KCS KCS全称是Keyboard Controller Style,关于这个名称不用过多的追究,只需要知道它是系统(BIOS和OS)和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口,包括接口使用方式和数据。内容参考自《ipmi-second-gen…...
90%的人都不算会网络安全,这才是真正的白帽子技术【红队】
我敢说,现在网上90%的文章都没有把网络安全该学的东西讲清楚。 为什么?因为全网更多的都是在讲如何去渗透和公鸡,却没有把网安最注重的防御讲明白。 老话说得好:“攻击,是为了更好的防御。”如果连初衷都忘了&#x…...
关于vuex的使用
1.首先安装vuex npm install vuex --save 这时如果直接安装vuex,不指定版本的话,就会直接安装最新的vuex的版本。所以会出现报错。 报错就安装这个 npm install --save vuex3 2.创建文件夹, 有的时候安装好会自动创建vuex的文件夹 …...
第53篇-某商城sign参数分析-webpack【2023-03-07】
声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析三、完整代码一、前言 今天再来试一个webpack的例子吧,网址: aHR0cHM6Ly9tLnlxYi5jb20vYmFuay9…...
探秘MySQL——排查与调优
文章目录一、问题排查一:SQL执行出错二、问题排查二:慢查询0.几个重要参数1.配置慢查询日志命令行配置(重启失效)修改配置文件(永久生效)2.查看慢查询日志3.问题排查1:Look_time耗时4.问题排查2…...
【9.数据页结构】
概述 InnoDB 的数据是按「数据页」为单位来读写的,也就是说,当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。数据库的 I/O 操作的最小单位是页,InnoDB 数据页…...
演唱会总是抢不到票?教你用Python制作一个自动抢票脚本
人生苦短 我用python 这个大家应该都知道吧? 是中国综合类现场娱乐票务营销平台, 业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。 如何快速抢票? 那么, 今天带大家用Python来制作一个自动抢票的脚本小程序 本文源码python安…...
【系统开发】WebSocket + SpringBoot + Vue 搭建简易网页聊天室
文章目录一、数据库搭建二、后端搭建2.1 引入关键依赖2.2 WebSocket配置类2.3 配置跨域2.4 发送消息的控制类三、前端搭建3.1 自定义文件websocket.js3.2 main.js中全局引入websocket3.3 App.vue中声明websocket对象3.4 聊天室界面.vue3.5 最终效果一、数据库搭建 很简单的一个…...
Learning C++ No.14【STL No.4】
引言: 北京时间:2023/3/9/12:58,下午两点有课,现在先把引言给搞定,这样就能激励我更早的把这篇博客给写完了,万事开头难这句话还是很有道理的,刚好利用现在昏昏欲睡的时候,把这个没…...
高速PCB设计指南(八)
七、产品内部的电磁兼容性设计 1 印刷电路板设计中的电磁兼容性 1.1 印刷线路板中的公共阻抗耦合问题 数字地与模拟地分开,地线加宽。 1.2 印刷线路板的布局 ※对高速、中速和低速混用时,注意不同的布局区域。 ※对低模拟电路和数字逻辑要分离。…...
什么是腾讯云关系型数据库(MySQL/SQL Server/MariaDB/PostgreSQL详解)
什么是腾讯云关系型数据库?腾讯云关系型数据库提供 MySQL、SQL Server、MariaDB、PostgreSQL详细介绍。腾讯云关系型数据库让您在云中轻松部署、管理和扩展的关系型数据库,提供安全可靠、伸缩灵活的按需云数据库服务。腾讯云关系型数据库提供 MySQL、SQL…...
进程通信相关概念
一、概念 1.1 通信方式有哪些 管道:水管,男纸条放入水管,女看了拿走不回复 消息队列:大盒子,男放入纸条,女看了不拿走,男女都可放 共享内存:直接桌子,男放桌上&#…...
05.Java的运算符
1.运算符计算机的最基本的用途之一就是执行数学运算,比如:int a 10;int b 20;a b;a < b;上述 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Ja…...
轮转数组(力扣189)
轮转数组 题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7…...
主流的“对象转换工具”使用示例大全以及性能的对比
目录 前言 源码地址 代码示例 引入依赖 先定两个实体用于转换 定义一个接口让所有转换器都集成 Apache BeanUtils BeanCopier bean-mapping bean-mapping-asm Dozer 自己写get/set JMapper json2json MapStruct(推荐) ModelMapper OriK…...
分享10个不错的C语言开源项目
今天跟大家分享10个重量级的C语言开源项目,C语言确实经得住考验: Redis:Redis是一个开源的高性能的键值对数据库。它以C语言编写,具有极高的性能和可靠性。 Nginx:Nginx是一个高性能的HTTP和反向代理服务器࿰…...
【阅读笔记】JavaScript设计模式与开发实践2--闭包与单例、策略模式
目录闭包与高阶函数Function 扩展函数柯里化函数单例模式透明的单例模式惰性单例策略模式策略模式发展策略模式实现闭包与高阶函数 Array.prototype.sort 接受一个函数当作参数,用户可以自行在该函数内指定排序方式 // 由小到大排序 let res [1, 4, 2].sort((a, …...
设计模式(二十)----行为型模式之责任链模式
1、概述 在现实生活中,常常会出现这样的事例:一个请求有多个对象可以处理,但每个对象的处理条件或权限不同。例如,公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同…...
数据持久化层--冷热分离
业务场景 有一个系统的主要功能是这样的:它会对接客户的邮件服务器,自动收取发到几个特定客服邮箱的邮件,每收到一封客服邮件,就自动生成一个工单。之后系统就会根据一些规则将工单分派给不同的客服专员处理。 这家媒体集团客户两年多产生了近2000万的工单,工单的操作记…...
Ubuntu16.04系统 VSCode中python开发插件的安装
VSCode中python开发插件的安装 1. python python插件提供了代码分析,高亮,规范化等很多基本功能 2. Python for vscode 3. Python Preview 实时可视化你的代码结果。如果你Leedcode等题时,可以安装这个插件。能为VSCode切换各种主题皮肤…...
asp.net做动态网站/成都seo优化
进来看了看keras, 比tf友好的多啊,总结下: Keras有两种类型的模型,顺序模型(Sequential)和泛型模型(Model) 首先比较简单的顺序型 Sequential模型接口 代码示例 model Sequential() model.a…...
创建wordpress网站/教育培训报名
serialize() 函数会检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NUL…...
公司网站建设需求书/亚马逊排名seo
在JMeter BeanShell 前置处理器中,您可以使用下面的代码来定义长度为2的数组: int[] myArray new int[2]; myArray[0] 1; myArray[1] 2;该代码创建了一个名为"myArray"的整型数组,并初始化为具有两个元素,分别为1和2。…...
网站开发需要英语/网络营销推广处点
第十一篇:REST调用 上篇写的是Ajax调用WCF,今天写一篇如何以REST方式调用WCF服务。不知道REST是什么的同学,可以去google一下。对某些类型的应用,REST还是相当不错的方式,所以专门写一篇来说明一下开发方法。 老规矩&a…...
怎样查后缀vc域名网站/百度权重查询爱站网
// // https://www.meitulu.com图片批量下载Node.js爬虫1.03 // 1.00 完成图片爬虫,手动输入页数和目录 // 1.01 改写。 // 1.02 手动输入页面url,然后自动解析 // 1.03 从命令行获得页面url,然后自动解析 // 2017年11月6日 //// 内置https模块ÿ…...
企业产品推广网站/网络营销手段
一个人成为穷人或者富人,到底是天注定还是靠打拼? 天赋与才能,对赚钱有多大作用呢? 什么事情靠勤奋努力有用? 什么事情靠勤奋努力就是瞎忙? 为什么投资更靠运气? 为什么选择比努力更重要&#x…...