栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

垃圾回收之CMS GC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

垃圾回收之CMS GC

 一.六个阶段

阶段 1: Initial Mark(初始标记)

这个阶段伴随着 STW 暂停。初始标记的目标是标记所有的 根对象,包括根对象直接引用的对象,以及被年轻代中所 有存活对象所引用的对象(老年代单独回收)。

阶段 2: Concurrent Mark(并发标记)

在此阶段,CMS GC 遍历老年代,标记所有的存活对象,从 前一阶段 “Initial Mark” 找到的根对象开始算起。 “并发标 记”阶段,就是与应用程序同时运行,不用暂停的阶段。

阶段 3: Concurrent Preclean(并发预清理)

此阶段同样是与应用线程并发执行的,不需要停止应用线 程。 因为前一阶段【并发标记】与程序并发运行,可能 有一些引用关系已经发生了改变。如果在并发标记过程中 引用关系发生了变化,JVM 会通过“Card(卡片)”的方 式将发生了改变的区域标记为“脏”区,这就是所谓的 卡片 标记(Card Marking)。 

阶段 4: Final Remark(最终标记)

最终标记阶段是此次 GC 事件中的第二次(也是最后一次)STW 停顿。本阶段的目标是完成老年代中所有存活对象的标记。因为 之前的预清理阶段是并发执行的,有可能 GC 线程跟不上应用程 序的修改速度。所以需要一次 STW 暂停来处理各种复杂的情况。 通常 CMS 会尝试在年轻代尽可能空的情况下执行 Final Remark 阶段,以免连续触发多次 STW 事件。

阶段 5: Concurrent Sweep(并发清除)

此阶段与应用程序并发执行,不需要 STW 停顿。JVM 在此 阶段删除不再使用的对象,并回收他们占用的内存空间。

阶段 6: Concurrent Reset(并发重置)

此阶段与应用程序并发执行,重置 CMS 算法相关的内部 数据,为下一次 GC 循环做准备

二.CMS优缺点

CMS 垃圾收集器在减少停顿时间上做了很多复杂而有用的 工作,用于垃圾回收的并发线程执行的同时,并不需要暂停 应用线程。 当然,CMS 也有一些缺点,其中最大的问题就 是老年代内存碎片问题(因为不压缩),在某些情况下 GC 会造成不可预测的暂停时间,特别是堆内存较大的情况下。

三.特点

其对年轻代采用并行 STW 方式的 mark-copy (标记-复制)算法,对老年代主要使用并发 mark-sweep ( 标记-清除)算法。

CMS GC 的设计目标是避免在老年代垃圾收集时出现长时间的卡顿,主要通过两种手段来达成此目标:

1)不对老年代进行整理,而是使用空闲列表(free-lists)来管理内存空间的回收。

2) 在 mark-and-sweep (标记-清除) 阶段的大部分工作和应用线程一起并发执行。

也就是说,在这些阶段并没有明显的应用线程暂停。但值得注意的是,它仍然和应用线程争抢CPU 时。 默认情况下,CMS 使用的并发线程数等于 CPU 核心数的 1/4。 如果服务器是多核 CPU,并且主要调优目标是降低 GC 停顿导致的系统延迟,那么使用 CMS 是个很明智 的选择。进行老年代的并发回收时,可能会伴随着多次年轻代的 minor GC

四.参数配置

java -Xmx1g -Xms1g -XX:-UseAdaptiveSizePolicy -XX:-UseConcMarkSweepGC -jar gateway-server-0.0.1-SNAPSHOT.jar
五.并行 Parallel 与并发 Concurrent 的区别?

两者都是多线程运行,不同的是,并行Parallel在GC期间所有的CPU内核都用来做垃圾回收,暂停了业务线程;而并发 Concurrent在GC期间大部分时候和应用线程一起执行,不影响业务线程的连续执行。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/845736.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号