聊一聊CMS垃圾回收器

CMS垃圾回收器的名字是(Ccrrent Mark Sweep并发标记清除),是一款采用标记清理算法回收老年代的垃圾回收器!

并发性

cms与其他回收器的不同是cms只有在根节点枚举阶段的时候会stop the world,其他阶段可以和用户线程并发执行,极大的降低了用户线程的暂停时间。特别适用于互联网网站或者B/S系统的服务端上,这类重视服务响应速度的,给用户良好的体验的情况。

清理过程

cms回收垃圾分为四个步骤:

  • 初始标记:根节点枚举,枚举全部的GC Roots对象。此阶段会stw,但是耗时极短。
  • 并发标记:从标记的gcroots节点开始根据引用遍历gc堆,访问到的对象说明是可达的,访问不到的对象说明是不可达的可以被GC。
  • 重新标记:用户线程和CMS线程是并发的,可能会导致某些对象改变,因此重新标记改变的对象
  • 并发清除:清理标记的垃圾

三色标记算法

在并发标记过程中,我们采用三色标记算法来标记对象。具体如下:

把每个对象,按照是否访问过标记成三种颜色:

  • 白色:还没有被垃圾回收器访问
  • 黑色:已经被垃圾回收器访问,并且这个对象的所有引用也都被垃圾回收器访问过
  • 灰色:已经被垃圾回收器访问,但是这个对象至少还有一个引用没有被垃圾回收器访问
    聊一聊CMS垃圾回收器

在标记过程中,用户线程还会继续执行。如果一个对象标记为可达后,用户线程删除了所有指向此对象的引用,那么这个对象已经是垃圾了,但本次GC却不会回收这个垃圾,这样的垃圾被称作浮动垃圾,只能在下一次GC时清理。

如果一个对象标记为不可达后,用户线程却让这个对象变得可达,那么会把原本存活的垃圾回收,这样的话访问这个对象肯定会发生错误。

这种错误产生的条件有两个,必须同时满足时才会才会产生这种错误:

1. 用户线程插入了黑色对象指向白色对象的引用
2. 用户线程删除了全部从灰色对象到这个白色对象的直接引用或者间接引用

我们只需要破坏其中的一个条件即可解决这个问题。

增量更新:破坏条件一,当黑色对象插入指向白色对象的引用后,把黑色对象记录下来,等待下一轮重新标记

原始快照:破坏条件二,灰色对象删除白色对象的引用后,把白色对象记录下来,等待下一轮重新标记

上一篇:Anchor CMS 0.12.7 跨站请求伪造漏洞(CVE-2020-23342)


下一篇:GC基础知识