CMS
并发标记清除器
1、过程
- 初始标记:标记一下GC Roots 能直接关联的对象,速度快
- 并发标记: 进行GC Roots Tracing , 标记全部的垃圾对象,耗时长
- 重新标记: 修改并发标记的产生的垃圾对象,耗时较短
- 并发清除:使用标记-清除算法清除垃圾,耗时较长
初始标记和重新标记时会停止用户线程的,并发标记和并发清除是用户线程和gc线程并行执行
2、CMS回收停顿几次
2次
以最少的STW,找出要清理的垃圾
3、为什么要STW
如果不暂停用户线程,就会不断的产生垃圾,永远也清理不玩
采用标记-清除算法,用户程序运行会导致对象的引用关系发送变化
漏标
:原来不是垃圾,但是在GC的过程中产生了一些浮动垃圾,下次GC清理就好
错标
:开始没有引用,但是GC的同时,用户线程又重新引用了他,但这个时候把它当垃圾清理掉了,这就会使程序运行错误
4、如何识别垃圾
三色标记算法
:
如果一个对象到GC ROOT没有任何一条引用链就表示可以被回收
标记步骤:
- 所有的对象都是白色
- 直接关联的对象设为灰色
- 遍历灰色对象的所有引用,灰色对象设置黑色,引用设置为灰色
- 重复上面步骤,知道没有灰色对象位置
- 结束时,黑色为存活对象,白色为对象回收
这个过程正确执行的前提是没有其他线程改变对象间的引用关系。
5、cms 为什么要停顿两次
以最少的STW成本,找出要清理的垃圾
全量垃圾和增量垃圾
-
初始标记就是找出全量垃圾根对象
-
并发标记:也是找出全量垃圾的根对象
-
重新标记:找出增量垃圾
-
标记-清除就是清除垃圾对象