当前位置: 首页 > news >正文

Go语言基础(十五):垃圾回收机制(三色标记)

文章目录

    • 一、标记清除(三色标记)大致原理
        • 1、标记细节
        • 2、root对象
    • 二、垃圾回收触发机制

垃圾回收(Garbage Collection),是一种自动管理内存的机制。传统编程语言(如C/C++)需要开发者对无用内存资源进行手动释放。而 Go 则是通过 runtime 实现对内存资源的管理,自动释放无用内存资源。

一、标记清除(三色标记)大致原理

三色标记法将对象分为三类:

  • 白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。
  • 灰色对象(确定存活):已被回收器访问到的对象,此时已经能确认该对象是存活的。但回收器需要对其中的一个或多个指针进行扫描,因为他们可能还指向其他白色对象。
  • 黑色对象(确定其所有引用此对象的对象):已被回收器访问到的对象,其中所有字段都已被扫描,黑色对象中任何一个指针都不可能直接指向白色对象。

GC工作流程(其中有两次stop the world!):
在这里插入图片描述

1、标记细节

  • GC 开始时,认为所有 object 都是 白色,即垃圾。
  • 从 root 区开始遍历,被触达的 object 置成 灰色。
  • 遍历所有灰色 object,将他们内部的引用变量置成 灰色,自身置成 黑色
  • 循环第 3 步,直到没有灰色 object 了,只剩下了黑白两种,白色的都是垃圾。

对于黑色 object,如果在标记期间发生了写操作,写屏障会在真正赋值前将新对象标记为 灰色。
标记过程中,mallocgc 新分配的 object,会先被标记成 黑色 再返回。

2、root对象

root对象在垃圾回收的术语中又叫做root集合,它是垃圾回收器在标记过程时最先检查的对象。

根对象包括:

  • 全局变量:程序在编译期就能确定的那些存在于程序整个生命周期的变量。
  • 执行栈:每个 goroutine 都包含自己的执行栈,这些执行栈上包含栈上的变量及指向分配的堆内存区块的指针。
  • 寄存器:寄存器的值可能表示一个指针,参与计算的这些指针可能指向某些赋值器分配的堆内存区块。

二、垃圾回收触发机制

1、内存分配量达到阀值触发

  • 每次内存分配时都会检查当前内存分配量是否已达到阀值,如果达到阀值则立即启动 GC。
  • 阀值 = 上次 GC 内存分配量 * 内存增长率
  • 内存增长率由环境变量 GOGC 控制,默认为 100,即每当内存扩大一倍时启动 GC。

2、定期触发

  • 默认情况下,最长 2 分钟触发一次 GC,这个间隔在 src/runtime/proc.go:forcegcperiod 变量中被声明

3、手动触发

  • 程序代码中也可以使用 runtime.GC()来手动触发 GC。这主要用于 GC 性能测试和统计。
http://www.lryc.cn/news/13218.html

相关文章:

  • 一文了解build.gradle配置
  • 【Redis 高级】- 持久化 - RDB
  • SpringSecurity的安全认证的详解说明(附完整代码)
  • 详解制造业业务数据模型
  • BigDecimal使用注意避坑
  • windows环境下,vue启动项目后打开chrome浏览器
  • SpringBoot2.X整合ClickHouse项目实战-从零搭建整合(三)
  • 学海记录项目测试报告
  • 【1792. 最大平均通过率】
  • 言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)
  • UML-时序图以及PlantUML绘制
  • 【Redis】Redis 有序集合 Zset 操作 ( 简介 | 查询操作 | 增加操作 | 删除操作 | 修改操作 )
  • Java特性之设计模式【策略模式】
  • IR-CUT 保证摄像机成像效果的滤镜
  • openpnp - 普通航空插头和PCB的连接要使用线对板连接器
  • Python3 错误和异常实例及演示
  • Android 9.0第三方app根据包名设置为横屏显示
  • MySQL会导致索引失效的情况与解决索引失效的方法
  • 使用nginx单独部署Vben应用
  • ES6新特性详解
  • Ubuntu下安装 ntfs-3g
  • 【专业认知】抖音就业 / 保研北大教育学 / 留学南加州EE / 微软就业
  • 【算法题】2 的 n 次幂的背后
  • 【人工智能AI】一、NoSQL 企业级基础入门《NoSQL 企业级基础入门与进阶实战》
  • Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库
  • 实现8086虚拟机(四)——mov 和 jmp 指令解码
  • 数据库技术-函数依赖、键与约束、范式
  • shiro CVE-2020-1957
  • RabbitMQ 入门到应用 ( 五 ) 基本应用
  • 部署dapr的辛酸历程