@lanling_ 这就是最后一个例子重点说明的哈,首先要明白一个概念,只要一个对象的父对象或者祖父对象是灰色的,这个对象就是安全的。
1. 如果一个栈被标位黑色的(曾经有过一个瞬间栈对象所指向的子对象都被标位灰色了),那么就算后面这个栈的栈对象指向别的白色对象a,这个白色对象a之前肯定有一个父节点或者祖父节点b是灰色的,所以b 会保护 a,如果当那个b删除引用的时候, shade(*slot)会把子对象c或者a变为灰色,这样a就是灰色或者被c保护了
2. 如果这个栈还是灰色的(里面仍有栈对象是灰色的)。
2.1 白色对象被灰色栈对象指向,就直接是安全的。
2.2 白色对象a被栈中的黑色对象指向,因为栈对象只有在所有指向的对象都是灰色后才会标黑,所以这种情况的出现只能是在标黑之后进行指向的操作,那么肯定有一个别的非黑色对象b也指向这个白色对象a,这个非黑色的对象b是灰色的,那么就能直接保护a,如果其是白色的,那么其肯定被一个灰色的父或者祖父灰色节点c所保护,同样c也会保护a。
golang 1.8 gc的演进在java的gc中,主要有三种算法,即:标记-删除,标记-整理,复制,网上有很多资料介绍相关内容,其中标记主要是为了找到内存中不可达的对象,并将其回收。而gc过程中最关键的指...