【JVM】CMS垃圾回收器概念与问题

与GC的区别

GC指的是垃圾回收

GC算法是指垃圾回收算法

GC算法是内存回收的方法论,垃圾收集器是将算法落地实现

首先CMS不是重GC也不是轻GC,在新生区满后,会出发轻GC,将不能删除的数据放入到幸存区,幸存区会通过复制算法清理完成后再加入轻GC后的数据

CMS垃圾回收器主要针对的是老年代的垃圾回收,但是他并不是重GC,和重GC无关

CMS垃圾回收特点

        1.CMS只会回收老年代和永久代,不会回收年轻代

        2.CMS是一种预处理垃圾回收器,不能等到老年去内存用尽时回收,需要在内存用尽前,完成回收操作,否则会导致并发回收失败,所以CMS垃圾回收器开始执行回收操作,会有一个出发预知,默认是老年代或永久代达到92%

CMS处理过程

1.初始标记

       会出现swt(Stop一the一World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。)

        这一步的作用是标记存活的对象,由两部分

                1.标记老年代中所有的GC Roots对象,如下图节点1

                2.标记年轻代中活着的对象引用到老年代的对象,如节点2,3

2.并发标记

        从初始标记的对象(1,2,3)找出所有与他连接的对象(存活的对象)

        因为是并发运行的,这时候可能会存在新生代的对象晋升到老年代或者老年代的对象变化,会把上去对象锁子啊的Card标识为Dirty,后续只需要扫描这些DirtyCard,避免扫描整个老年代

        并发标记节点只负责将引用发生的Card标记为Dirty状态,不负责处理

        在并发标记的时候,节点4由新生代晋升到老年代,节点6又连接到了节点5,所以4和6被标记为Dirty,2中连接的数据被正常标记

3.预清理

这个节点用于处理前一个节点因为引用关系改变导致没有标记到的存活对象的,他会扫描标记所有的DirtyCard(4,6)

4.可被终止的预处理

这个阶段长丝承担下个阶段足够多的工作,此阶段最大持续时间为5妙,所以可以持续五秒,因为5面内能够发生一次轻gc

5.重新标记

作用时完成标记整个老年代所有的存活对象。这个节点重新标记的内存范围是给整个堆,也会包括年轻代和老年代,包括7,8这种新生代不可达,但是老年代被新生代引用的情况

会导致swt

6.并发清理

对所有不能用的对象进行并发清理

7.并发重制状态等待下次CMS的触发

并发执行,重新设置CMS算法内部的数据结构,准备下一个CMS生命周期的使用

问题

1.CMS收集器对处理器资源非常敏感

        CMS的垃圾清除是使用并发清除的,如果处理器核数不高,垃圾回收会造成很大负担

2.CMS无法处理浮动垃圾

        就是并发清理阶段用户线程还在运行,这段时间就可能产生新的垃圾,新的垃圾在此次GC无法清除,只能等到下次清理。这些垃圾就叫浮动垃圾

3.CMS是基于标记清除算法,会产生大量的碎片空间

参考文章

CMS垃圾回收器详解_zqz_zqz的博客-CSDN博客_cms垃圾回收器

CMS 存在的问题 - 知乎

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值