(一定不是垃圾,属于正在遍历的对象)
黑色:已经遍历过的对象 (一定不是垃圾)
步骤简单说明:
1:将每次创建的对象都标记为白色
2:扫描根节点(Root Set) 的对象,标记为灰色
3:遍历灰色节点的...,将灰色节点改为黑色,将灰色节点引用的节点改为灰色
4:重复步骤3,直到没有灰色节点
5:此时只剩黑色和白色节点,白色表示不可达对象,可以直接回收
三色标记法问题
以上gc步骤,都是建立在程序暂停时候执行的...,如果在程序运行的时候,就可能出现:
1:灰色节点一开始引用了一个对象A
2:黑色节点开始引用对象A
3:灰色节点删除了对象A的引用
在此时,由于灰色节点丢失了对象A的引用,导致无法扫描到对象A,对象A...(将 B 挂在 A 下游,B 必须被标记为灰色)
由于栈空间容量小,响应速度快,函数调用弹出频繁,所以插入屏障在栈对象操作中不使用,仅在堆对象中使用
所以在回收完堆对象时,栈空间对象需要进行一次 停止程序运行...barrier)机制
混合写屏障规则:
1、GC 开始将栈上的可达对象全部扫描并标记为黑色 (之后不再进行第二次重复扫描,无需 STW)
2、GC 期间,任何在栈上创建的新对象,均为黑色。