《深入理解java虚拟机 第二版 JVM高级特性与最佳实践》里面提到CMS垃圾收集器。
CMS垃圾收集器的垃圾回收分4个步骤:
- 初始标记(CMS initial mark)
- 并发标记(CMS concurrent mark)
- 重新标记(重新标记)
- 并发清除(CMS concurrent sweep)
初始标记:仅仅标记GC Root能直接关联到的对象。
并发标记:对初始标记标记过的对象,进行trace(进行追踪,得到所有关联的对象,进行标记)
重新标记:(原文):为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录。
导致产生变动的那一部分对象,到底是哪部分对象?
网上查找很多资料,鲜有讲清楚这个问题的文章。结合找到的所有资料,我认为应该是这样的:
重新标记,重新从GC Root开始查找新关联的对象,并进行标记;而初始标记、并行标记两个步骤标记的对象,即使并行标记过程中已经没有相关引用了,也不会再去清除这些对象的标记(直到等到下一次GC发生的时候再去清除)
参考: