垃圾回收是指对不再使用的内存资源进行自动回收的功能。C++等语言中使用的是手动管理,而Go中则是自动管理。Go的垃圾回收机制主要是三色标记法,可以减少因垃圾回收导致程序暂停的影响。本文主要是学习这个机制。
C++种,堆内存需要通过new
、delete
等关键字手动管理,栈内存则是编译器自动管理。
而在Golang中,堆栈内存均为编译器进行管理,此文所提到的三色标记法就是堆内存管理的方法。 栈内存仅通过FILO,不需要GC机制。
本文学习的三色标记法,是堆内存管理。
在三色标记法之前,Go采取的是标记清除法
进行垃圾回收处理。
这个方法很好理解,就是通过STW
(简单理解为暂停整个程序),然后对所有对象进行标记与回收。
此方法最大弊端就是在整个GC期间需要STW,将整个程序暂停。大大影响性能。
三色分别是黑、白、灰三色。
??:活跃的内存块
??:代表最终需要清理的对象内存块
灰?:待处理的内存块
(1)将所有对象都置为??
(2)扫描出所有的可达(可以搜寻到的)对象,也就是还在使?的,不需要清理的对象,标记为灰?,放?待处
理队列
(3)从队列中提取灰?对象,将其引?对象标记为灰?放?队列,将??标记为??。(需重复执行此步)
(4)有专有的锁监视对象内存修改
(5)在完成全部的扫描和标记?作之后,剩余的只有??和??,分别代表活跃对象与回收对象
(6)清理所有的??对象
本文学习主要参考自公众号:代码随想录,其知识星球的PDF资源,力荐!
同时参考了以下文章:
https://draveness.me/golang/docs/part3-runtime/ch07-memory/golang-garbage-collector/#%E6%A0%87%E8%AE%B0%E6%B8%85%E9%99%A4
https://community.apinto.com/d/34057-golang-gc