golang垃圾回收

简介: Go语言1.3前采用标记清除的垃圾回收,1.5后引入三色标记法(白、灰、黑)解决长时间停止问题。三色标记通过强弱不变式避免对象丢失,保证垃圾回收准确性。过程包括从根节点遍历将对象从白转灰,再转黑,最终回收白色对象。为防止对象丢失,使用插入和删除写屏障,但插入屏障可能导致短暂暂停,结束时仍需STW扫描栈。删除屏障保护灰色到白色对象的路径不断。

4.29
Golang中GC回收机制三色标记与混合写屏障
第14讲-总结哔哩哔哩bilibili

三个阶段

gc垃圾回收

早期是

GO1.3 标记清除 
之前的标记清除:开始标记找到可达对象,并标记,标记完后清楚未标记的

较长时间的STW,使程序暂停,程序出现卡顿

GO1.5 
三色标记法 根据强弱三色不变式 指定了插入写屏障和删除写屏障
插入写屏障 删除写屏障

插入写屏障最后要启用栈上的gc

删除写屏障 回收精度低

白色 灰色 黑色

三色标记最不希望发生的事情:一个白色对象被黑色对象引用(白色对象被黑色对象引用)

灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

同时满足,对象丢失

如果三色标记满足强弱不变式之一,即可保证不丢失对象

开始都是白色,然后从根节点开始遍历所有的对象,把便利到的对象从白色放入灰色

然后遍历灰色,将灰色的引用对象放入灰色,将灰色放入黑色。重复直到灰色对象全部消失

回收所有的白色对象,也就是回收垃圾

也还是需要STW来保护全过程

如果不使用 STW来保护会出现的问题:

一个白色对象被黑色对象引用,白色被挂在黑色下

灰色对象与它之间的可达关系的白色对象遭到破坏(灰色同时丢了该白色)

两个条件同时满足,那么就会出现对象丢失的现象

就会出现合法对象被回收

引入强弱三色不变式

强三色不变式: 强制性不允许黑色对象引用白色对象

弱三色不变时: 黑色对象也可以引用白色对象,白色对象存在其他灰色对象对它的引用,或者可达它的链路上存在灰色对象

如果三色标记满足强弱不变时之一,即可保证不丢失对象

强弱三色标记引申出插入屏障和删除屏障

插入写屏障:当A对象引用B对象的时候,B对象被标记为灰色

不在栈上使用 还会有栈上额外的短时间的暂停 大约需要10-100ms

结束时需要STW来重新扫描栈 可能出现黑色引用白色

删除写屏障:被删除的对象,如果自身为灰色或者白色,都被标记为灰色

保护灰色对象到白色对象的路径不会断

目录
相关文章
|
5月前
|
Java Go
Golang底层原理剖析之垃圾回收GC(二)
Golang底层原理剖析之垃圾回收GC(二)
105 0
|
12月前
|
算法 Java Go
每位 Gopher 都应该了解的 Golang 语言的垃圾回收算法
每位 Gopher 都应该了解的 Golang 语言的垃圾回收算法
35 0
|
5月前
|
算法 安全 Java
Golang底层原理剖析之垃圾回收GC(一)
Golang底层原理剖析之垃圾回收GC(一)
95 0
|
算法 Java 程序员
golang 系列:啥是垃圾回收?
golang 的三色标记法虽然没有 java 的内存回收机制成熟,但它细分了回收过程,通过写屏障技术,能和用户程序并发进行,这也一定程度的提高了内存回收速度。
232 0
golang 系列:啥是垃圾回收?
|
算法 Java Go
浅析 Golang 垃圾回收机制
介绍 Golang 的垃圾回收机制
7249 0
|
1月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
76 4
Golang语言之管道channel快速入门篇
|
1月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
53 4
Golang语言文件操作快速入门篇
|
1月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
67 3
Golang语言之gRPC程序设计示例
|
1月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
61 4
|
1月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
40 3