CMSGC-STW-GCRoots-安全点(区)-三色标记

时间:2021-10-07
本文章向大家介绍CMSGC-STW-GCRoots-安全点(区)-三色标记,主要包括CMSGC-STW-GCRoots-安全点(区)-三色标记使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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

CMS-Concurrent Mark Sweep 并发 标记 清除

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

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

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

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

CMS四个步骤

  1. 初始标记

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

如果线程5正在休眠,他的代码没有执行,这里要引入安全区的概念。安全区是在这个代码区域之内,对象引用关系都不会发生变化。当线程5想从安全区出来,要看初始标记有没有结束。

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

GC ROOTS:

  • 虚拟机栈引用的对象

  • NATIVE栈引用的对象

  • 类静态属性引用的对象

  • 常量引用的对象

  • synchronized锁引用的对象

  1. 并发标记

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

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

比如,引用消失:有一个已经被标记为黑色的对象,他的引用又断掉了,这个叫做浮动垃圾,下次再回收。

还有就是新の引用:有一个已经被标记为黑色的对象,他不会再被扫描了,当他又建立新的引用时,就做一个记录,不要收集他。

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

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

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

  1. 重新标记

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

  1. 并发清除

清理垃圾。

Re

原文地址:https://www.cnblogs.com/bllbl/p/15369773.html