CMSGC-GCRoots-三色标记
CMS收集器的特点:追求最短的停顿时间。
CMS-Concurrent Mark Sweep 并发 标记 清除
标记垃圾的方式
标记清除:标记处需要回收的对象,标记完成后统一回收所有被标记的对象。
标记复制:将内存分为两块, 每次用一块。当一块内存用完时,将活着的对象复制到另一块上。
标记整理:让存活的对象整理到一端,清除掉死对象。
- CMS平时用标记清除,碎片多了用标记整理。
CMS四个步骤
- 初始标记
在正常执行的时候如果要GC了,要找一个安全点停下来。安全点是对象引用关系不会发生变化的点。
初始标记会STW,业务代码都不会跑。初始标记会标记GC ROOTS。GC ROOTS是我们进行可达性分析时的找到的根节点,从根节点出发,他们引用的对象就是存活。
GC ROOTS:
虚拟机栈引用的对象
NATIVE栈引用的对象
类静态属性引用的对象
常量引用的对象
synchronized锁引用的对象
- 并发标记
这个过程里用户线程和标记线程并发执行,这时用到三色标记法,三色是黑灰白,黑色表示对象已经被垃圾收集器访问过,且所有引用也被扫描过,他是安全存活的。灰色也被访问过,但是对象上至少存在一个引用没有被扫描过。白色表示没有被访问过。
但是因为用户线程在这个过程中可以改变对象的引用关系。
例如,在扫描2的引用时,2与3的引用断了,但是1又与3建立引用。
CMS的解决方法:将1再变为灰色节点。(增量更新)
G1的解决方法:虽然引用断了,但是把删除的引用记录下来,之后再按原来的快照扫描一次。(原始快照)
- 重新标记
重新标记过程2中变化了的引用关系,这时候STW。
- 并发清除
清理垃圾。
Reference
《深入理解JVM虚拟机》