CMSGC-GCRoots-三色标记

CMS收集器的特点:追求最短的停顿时间。

CMS-Concurrent Mark Sweep 并发 标记 清除

标记垃圾的方式

标记清除:标记处需要回收的对象,标记完成后统一回收所有被标记的对象。

标记复制:将内存分为两块, 每次用一块。当一块内存用完时,将活着的对象复制到另一块上。

标记整理:让存活的对象整理到一端,清除掉死对象。

  • CMS平时用标记清除,碎片多了用标记整理。

CMS四个步骤

  1. 初始标记

在正常执行的时候如果要GC了,要找一个安全点停下来。安全点是对象引用关系不会发生变化的点。

初始标记会STW,业务代码都不会跑。初始标记会标记GC ROOTS。GC ROOTS是我们进行可达性分析时的找到的根节点,从根节点出发,他们引用的对象就是存活。

GC ROOTS:

  • 虚拟机栈引用的对象

  • NATIVE栈引用的对象

  • 类静态属性引用的对象

  • 常量引用的对象

  • synchronized锁引用的对象

  1. 并发标记

这个过程里用户线程和标记线程并发执行,这时用到三色标记法,三色是黑灰白,黑色表示对象已经被垃圾收集器访问过,且所有引用也被扫描过,他是安全存活的。灰色也被访问过,但是对象上至少存在一个引用没有被扫描过。白色表示没有被访问过。

但是因为用户线程在这个过程中可以改变对象的引用关系。

例如,在扫描2的引用时,2与3的引用断了,但是1又与3建立引用。

CMS的解决方法:将1再变为灰色节点。(增量更新)

G1的解决方法:虽然引用断了,但是把删除的引用记录下来,之后再按原来的快照扫描一次。(原始快照)

image

  1. 重新标记

重新标记过程2中变化了的引用关系,这时候STW。

  1. 并发清除

清理垃圾。

Reference

《深入理解JVM虚拟机》

posted @ 2021-10-07 22:11  csgopher  阅读(232)  评论(0编辑  收藏  举报