0
点赞
收藏
分享

微信扫一扫

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

自由情感小屋 02-07 19:00 阅读 2

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

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

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

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

1.初始标记

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

                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这种新生代不可达,但是老年代被新生代引用的情况

6.并发清理

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

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

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

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

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

2.CMS无法处理浮动垃圾

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

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

参考文章

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

CMS 存在的问题 - 知乎

举报

相关推荐

0 条评论