一文详解go底层原理之垃圾回收

2024-09-07 12:28

本文主要是介绍一文详解go底层原理之垃圾回收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 前置知识

1.1 三色回收法

三色回收法在gov1.5版本时是主流的gc方式

简单介绍一下流程:

  1. 暂停程序执行流程(开启STW)
  2. 将新创建的对象全部标记为白色
  3. 从根节点开始遍历,把遍历到的第一层全部改为灰色
  4. 遍历一次灰色集合,将灰色集合引用对象变为黑色
  5. 重复上述步骤,知道没有灰色对象
  6. 清除白色对象
  7. 结束STW

1.2 STW

上述1.1所说的STW就是指的stop the world,简单的说就是让程序停止,肯定是要耗费大量的时间,所以我们应该尽量减少STW

因此我们来看一个如果不进行STW就进行三色回收的场景
一个白色对象被黑色对象引用,且灰色对象与它可达的白色对象断联

这时候白色对象和其下游对象可能被清理,造成对象丢失

1.3强弱不等式

强不等式:
强制性的不允许黑色对象引用白色对象

弱不等式:
黑色对象可以引用白色对象,但是这个白色对象必须存在其他灰色对象对它的引用,或者可达其链路上存在灰色对象

1.4两种屏障方式

插入写屏障 :
是在垃圾回收器执行过程中插入的一种机制,用来确保对对象的修改不会干扰垃圾回收的正确性。当程序在执行时,可能会修改对象的字段,这些字段可能指向其他对象。在这种情况下,写屏障会插入到代码中,以便在修改对象的字段时,垃圾回收器能够及时更新它的状态,从而避免垃圾回收器丢弃仍在使用的对象。
简单的说,就是如果B挂在A的下游,则B必须为灰色

但是注意,插入写屏障在栈上不能生效,原因就是栈上函数调用弹出频繁使用,所以插入写屏障过于影响性能

删除写屏障:
删除写屏障 是指在不再需要写屏障时,移除写屏障的操作。在某些情况下,垃圾回收器不再需要持续跟踪某些对象的引用,写屏障可以被删除以优化性能。删除写屏障可以减少运行时开销,提高程序的效率。

简单的说,被删除的对象,如果自身为灰色或者白色,则为灰色,这种方式回收精度过低,原因就是一个对象即使被删除掉最后一个指向它的指针,它依然可以存活一轮

2 混合写屏障+三色回收法

Go V1.8版本引入了混合写屏障机制(hybrid write barrier),避免了对栈re-scan的过程,极大的减少了STW的时间。结合了两者的优点。

注意混合写屏障是GC的一种屏障机制,所以只是当程序执行GC的时候,才会触发这种机制

​Golang中的混合写屏障满足弱三色不变式,结合了删除写屏障和插入写屏障的优点,只需要在开始时并发扫描各个goroutine的栈,使其变黑并一直保持,这个过程不需要STW,而标记结束后,因为栈在扫描后始终是黑色的,也无需再进行re-scan操作了,减少了STW的时间。

步骤
GC开始将栈上的对象全部扫描并标记为黑色(之后不再进行第二次重复扫描,无需STW)
GC期间,任何在栈上创建的新对象,均为黑色
被删除的对象标记为灰色
被添加的对象标记为灰色
满足->变形的弱三色不变式

这里我们注意, 屏障技术(步骤三四)是不在栈上应用的,因为要保证栈的运行效率

这篇关于一文详解go底层原理之垃圾回收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145055

相关文章

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到