GC
GCGarbage Collection
目前主流的垃圾回收算法有两类,分别是追踪式垃圾回收算法(Tracing garbage collection)和引用计数法( Reference counting )。
而三色标记法是属于追踪式垃圾回收算法的一种。
追踪式算法的核心思想是判断一个对象是否可达,因为一旦这个对象不可达就可以立刻被 GC 回收了。
如何判断一个对象是否可达
分为两步:
- 第一步找出所有的全局变量和当前函数栈里的变量,标记为可达。
- 第二步,从已经标记的数据开始,进一步标记它们可访问的变量,周而复始,这一过程也叫传递闭包。
Mark-And-Sweep
这个算法就是严格按照追踪式算法的思路来实现的。
1
GCGC
三色标记法
on-the-fly
原理如下
整个进程空间里申请每个对象占据的内存可以视为一个图, 初始状态下每个内存对象都是白色标记。
stop the world
第二轮可以恢复start the world,将第一步队列中的对象引用的对象置为灰色加入队列,一个对象引用的所有对象都置灰并加入队列后,这个对象才能置为黑色并从队列之中取出。循环往复,最后队列为空时,整个图剩下的白色内存空间即不可到达的对象,即没有被引用的对象;
stop the worldwritebarrier
on-the-fly
简化步骤如下:
1、首先创建三个集合:白、灰、黑。
2、将所有对象放入白色集合中。
3、然后从根节点开始遍历所有对象(注意这里并不递归遍历),把遍历到的对象从白色集合放入灰色集合。
A、F
4、之后遍历灰色集合,将灰色对象引用的对象从白色集合放入灰色集合,之后将此灰色对象放入黑色集合
我们可以发现这个A指向了B,C,D所以也就是把BCD放到灰色中,把A放到黑色中,而F没有指任何的对象,所以直接放到黑色中。
5、重复 4 直到灰色中无任何对象
因为D指向了A所以D也放到了黑色中,而B和C能放到黑色集合中的道理和F一样,已经没有了可指向的对象了。
write-barrier
由于这个EGH并没有和RootSet有直接或是间接的关系,所以就会被清除。
7、收集所有白色对象(垃圾)
所以我们可以看出这里的情况,只要是和root set根集合直接相关的对象或是间接相关的对象都不会被清楚。只有不相关的才会被回收。
参考文档:
如何学习Go
如果你是小白,你可以这样学习Go语言~
七篇入门Go语言
第六篇:网络编程