1三色标记算法
对于并发标记,我们不得不了解并发标记的三色标算法
它是描述追踪式回收器的一种有效方法,利用它可以推演回收器的正确性
我们将对象分成三种类型:
- 黑色—根对象, 或者该对象与它的子对象都被扫描过(对象被标记了,且它的所有field都被标记完了)
- 灰色—对象本身被扫描,但还没扫描完该对象中的子对象(它的field还没有被标记或标记完)
- 白色—未被扫描对象,扫描完成所有对象之后,最终为白色的未不可达对象,即垃圾对象(对象没有被标记到)
只要对象被标记了,那说明它是可达的.不应该被GC回收掉
但是如果在标记过程中,应用程序也在运行,那么对象的指针就有可能改变. 这样的话,我们就会遇到一个问题—对象丢失(漏标)问题
例如:
当垃圾收集器扫描到下面情况时
这时候应用程序执行了以下操作:
- A.c = C
- B.c = null
这样,对象的状态图就变成了如下情形:
这时候垃圾收集器再标记扫描的时候就会变成下图这样
很显然,此时C是白色的,被认为是垃圾需要清理掉,显然这是不合理的