【每日八股】Golang篇(五):垃圾回收

目录

golang 的垃圾回收?

golang GC 算法使用的是无分代(对象没有代际之分)、不整理(回收过程中不对对象进行移动和整理)、并发(与用户代码并发执行)的三色标记清扫算法。

三色标记清扫算法将对象分为三类,分别是:

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

对象颜色标记的过程如下:

  • 第一步:初始化所有对象为白色的;
  • 第二步:从根对象出发扫描所有可达对象,标记为灰色,放入待处理队列;
  • 第三步:从待处理队列取出灰色对象,将其引用的对象标记为灰色,并放入待处理队列中,当前对象标记为黑色;
  • 重复第三步,直到待处理队列为空,此时白色对象积为不可达的"垃圾"对象,回收白色对象。

写屏障?

由于颜色标记与垃圾回收和程序执行是并发的,在标记的过程中,难免会出现以下极端情况:清扫开始前,标记为黑色的对象引用了一个新申请的对象,它肯定是白色的,而由于黑色对象不会被再次扫描,那么这个白色对象就会在扫描结束后被当作真正的白色对象回收掉。

为了避免上述极端情况的产生,golang 采用写屏障,作用就是为了避免勿清扫。具体来说,写屏障在内存的写操作前,维护一个约束,从而确保清扫开始前,黑色对象不能够引用白色对象。GC 一旦开始执行,无论是创建对象还是改变对象的引用,一律将新创建的或新引用的对象标记为灰色的,进入待处理队列,这样可以保证它们至少不会在本次 GC 被误删除。

垃圾回收的触发条件?

  • 系统触发:运行时自行根据内置的条件,检查、发现,并执行 GC,确保整个程序的可用性;
  • 系统监控:当超过 2 min 没有 GC 时,强制调用 GC;
  • 步调(Pacing)算法:其核心思想是控制内存增长的比例,当内存达到一定比例时触发 GC;
  • 触发:业务代码中手动调用 runtime.GC 触发 GC。
相关推荐
方圆想当图灵几秒前
Nacos 源码深度畅游:Nacos 配置同步详解(下)
分布式·后端·github
方圆想当图灵11 分钟前
Nacos 源码深度畅游:Nacos 配置同步详解(上)
分布式·后端·github
江公望21 分钟前
流媒体,包含哪些技术?Zynq MP方案
linux·服务器
小羊失眠啦.21 分钟前
用 Rust 实现高性能并发下载器:从原理到实战
开发语言·后端·rust
初学小白...31 分钟前
JVM入门知识点
java·服务器·jvm
坚定信念,勇往无前35 分钟前
基于rsync,局域网内,无需密码互传
服务器·网络·负载均衡
Filotimo_1 小时前
SpringBoot3入门
java·spring boot·后端
一 乐2 小时前
校园墙|校园社区|基于Java+vue的校园墙小程序系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·后端·小程序
阿巴~阿巴~2 小时前
IPv4地址转换函数详解及C++容器安全删除操作指南
linux·服务器·c++·网络协议·算法·c++容器安全删除操作·ipv4地址转换函数
golang学习记2 小时前
🍵 Go Queryx 入门指南:让数据库操作像喝奶茶一样丝滑!
后端