CMSGC-STW-GCRoots-安全点(区)-三色标记
Posted BLLBL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMSGC-STW-GCRoots-安全点(区)-三色标记相关的知识,希望对你有一定的参考价值。
CMS收集器的特点:追求最短的停顿时间。
CMS-Concurrent Mark Sweep 并发 标记 清除
标记清除:标记处需要回收的对象,标记完成后统一回收所有被标记的对象。
标记复制:将内存分为两块, 每次用一块。当一块内存用完时,将活着的对象复制到另一块上。
标记整理:让存活的对象整理到一端,清除掉死对象。
- CMS平时用标记清除,碎片多了用标记整理。
CMS四个步骤
- 初始标记
在正常执行的时候如果要GC了,要找一个安全点停下来。安全点是对象引用关系不会发生变化的点。
如果线程5正在休眠,他的代码没有执行,这里要引入安全区的概念。安全区是在这个代码区域之内,对象引用关系都不会发生变化。当线程5想从安全区出来,要看初始标记有没有结束。
初始标记会STW,业务代码都不会跑。初始标记会标记GC ROOTS。GC ROOTS是我们进行可达性分析时的找到的根节点,从根节点出发,他们引用的对象就是存活。
GC ROOTS:
虚拟机栈引用的对象
NATIVE栈引用的对象
类静态属性引用的对象
常量引用的对象
synchronized锁引用的对象
- 并发标记
这个过程里用户线程和标记线程并发执行,这时用到三色标记法,三色是黑灰白,黑色表示对象已经被垃圾收集器访问过,且所有引用也被扫描过,他是安全存活的。灰色也被访问过,但是对象上至少存在一个引用没有被扫描过。白色表示没有被访问过。
但是因为用户线程在这个过程中可以改变对象的引用关系。
比如,引用消失:有一个已经被标记为黑色的对象,他的引用又断掉了,这个叫做浮动垃圾,下次再回收。
还有就是新の引用:有一个已经被标记为黑色的对象,他不会再被扫描了,当他又建立新的引用时,就做一个记录,不要收集他。
在扫描2的引用时,2与3的引用断了,但是1又与3建立引用。
CMS的解决方法:将1再变为灰色节点。(增量更新)
G1的解决方法:虽然引用断了,但是把删除的引用记录下来,之后再按原来的快照扫描一次。
- 重新标记
重新标记过程2中变化了的引用关系,这时候STW。
- 并发清除
清理垃圾。
Re
以上是关于CMSGC-STW-GCRoots-安全点(区)-三色标记的主要内容,如果未能解决你的问题,请参考以下文章