请注意,本文编写于 523 天前,最后修改于 523 天前,其中某些信息可能已经过时。
Golang的垃圾回收(GC)机制是一种自动管理内存的机制,它负责回收不再使用的对象和内存空间,以确保程序的内存使用效率和稳定性。Golang的GC机制使用的是无分代、不整理、并发的三色标记清扫算法。
三色标记清扫算法
Golang的GC机制使用了三色标记清扫算法来进行垃圾回收。这个算法将对象分为三个颜色:白色、灰色和黑色。
- 白色对象:未被回收器访问到的对象,即不可达的对象。
- 灰色对象:已被回收器访问到的对象,但回收器需要对其中的一个或多个指针进行扫描,因为它们可能指向白色对象。
- 黑色对象:已被回收器访问到的对象,其中所有字段都已被扫描,不可能直接指向白色对象。
垃圾回收的过程如下:
- 初始状态下,所有对象都是白色的。
- 从根对象出发,扫描所有可达对象,将其标记为灰色,并放入待处理队列。
- 从待处理队列中取出灰色对象,将其引用的对象标记为灰色,并放入待处理队列,自身标记为黑色。
- 重复步骤3,直到待处理队列为空。此时,白色对象即为不可达的垃圾,可以进行回收。
Golang的GC特点
Golang的GC机制具有以下特点:
- 无分代:Golang的GC机制没有将对象分为不同的代际,所有对象都没有代际之分。
- 不整理:Golang的GC机制不会对对象进行整理,即不会移动对象的位置。这是因为Golang的内存分配算法基于
tcmalloc
,基本上没有内存碎片问题,并且顺序内存分配器在多线程场景下不适用。
- 并发:Golang的GC机制与用户代码并发执行,即垃圾回收过程与程序的执行可以同时进行。这使得停顿时间与对象的代际和大小无关,而是关注如何让GC与用户代码并发执行。
屏障机制
Golang的GC机制使用了屏障机制来保证垃圾回收的准确性。屏障机制可以分为两种类型:写屏障和读屏障。
- 写屏障:在写操作中,当一个指针被赋值给一个对象的字段时,会触发写屏障。写屏障会将被赋值的对象标记为灰色,并将其放入待处理队列,以确保被赋值的对象能够被正确扫描。
- 读屏障:在读操作中,当一个指针被读取时,会触发读屏障。读屏障会检查被读取的对象是否为白色,如果是,则将其标记为灰色,并将其放入待处理队列。
通过屏障机制,Golang的GC机制能够在并发执行的情况下保证垃圾回收的准确性。
Learn more:
- Golang垃圾回收(GC)介绍 | Random walk to my blog
- Go 语言垃圾收集器的实现原理 | Go 语言设计与实现
- 浅析 Golang 垃圾回收机制-阿里云开发者社区
本文作者:yowayimono
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA
许可协议。转载请注明出处!