以下内容摘自:《深入理解Java虚拟机:JVM高级特性与最佳实践》第3章垃圾收集器与内存分配策略
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的Java应用都集中在互联网站或B/S系统的服务端上,这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
从名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于“标记-清除”算法实现的,它的运作过程相对于前面几种收集器来说要更复杂一些,整个过程分为4个步骤,包括:
初始标记(CMS initial mark)
并发标记(CMS concurrent mark)
重新标记(CMS remark)
并发清除(CMS concurrent sweep)
其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,并发标记阶段就是进行GC Roots Tracing的过程,而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记的时间短。
由于整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,所以总体上来说,CMS收集器的内存回收过程是与用户线程一起并发地执行的。通过图3-10可以比较清楚地看到CMS收集器的运作步骤中并发和需要停顿的时间。
(点击查看大图)图3-10 Concurrent Mark Sweep 收集器运行示意图 |
CMS是一款优秀的收集器,它的最主要优点在名字上已经体现出来了:并发收集、低停顿,Sun的一些官方文档里面也称之为并发低停顿收集器(Concurrent Low Pause Collector)。但是CMS还远达不到完美的程度,它有以下三个显著的缺点:
CMS收集器对CPU资源非常敏感。其实,面向并发设计的程序都对CPU资源比较敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程(或者说CPU资源)而导致应用程序变慢,总吞吐量会降低。CMS默认启动的回收线程数是(CPU数量+3)/ 4,也就是当CPU在4个以上时,并发回收时垃圾收集线程最多占用不超过25%的CPU资源。但是当CPU不足4个时(譬如2个),那么CMS对用户程序的影响就可能变得很大,如果CPU负载本来就比较大的时候,还分出一半的运算能力去执行收集器线程,就可能导致用户程序的执行速度忽然降低了50%,这也很让人受不了。为了解决这种情况,虚拟机提供了一种称为“增量式并发收集器”(Incremental Concurrent Mark Sweep / i-CMS)的CMS收集器变种,所做的事情和单CPU年代PC机操作系统使用抢占式来模拟多任务机制的思想一样,就是在并发标记和并发清理的时候让GC线程、用户线程交替运行,尽量减少GC线程的独占资源的时间,这样整个垃圾收集的过程会更长,但对用户程序的影响就会显得少一些,速度下降也就没有那么明显,但是目前版本中,i-CMS已经被声明为“deprecated”,即不再提倡用户使用。
CMS收集器无法处理浮动垃圾(Floating Garbage),可能出现“Concurrent Mode Failure”失败而导致另一次Full GC的产生。由于CMS并发清理阶段用户线程还在运行着,伴随程序的运行自然还会有新的垃圾不断产生,这一部分垃圾出现在标记过程之后,CMS无法在本次收集中处理掉它们,只好留待下一次GC时再将其清理掉。这一部分垃圾就称为“浮动垃圾”。也是由于在垃圾收集阶段用户线程还需要运行,即还需要预留足够的内存空间给用户线程使用,因此CMS收集器不能像其他收集器那样等到老年代几乎完全被填满了再进行收集,需要预留一部分空间提供并发收集时的程序运作使用。在默认设置下,CMS收集器在老年代使用了68%的空间后就会被激活,这是一个偏保守的设置,如果在应用中老年代增长不是太快,可以适当调高参数-XX:CMSInitiatingOccupancyFraction的值来提高触发百分比,以便降低内存回收次数以获取更好的性能。要是CMS运行期间预留的内存无法满足程序需要,就会出现一次“Concurrent Mode Failure”失败,这时候虚拟机将启动后备预案:临时启用Serial Old收集器来重新进行老年代的垃圾收集,这样停顿时间就很长了。所以说参数-XX:CMSInitiatingOccupancyFraction设置得太高将会很容易导致大量“Concurrent Mode Failure”失败,性能反而降低。
还有最后一个缺点,在本节在开头说过,CMS是一款基于“标记-清除”算法实现的收集器,如果读者对前面这种算法介绍还有印象的话,就可能想到这意味着收集结束时会产生大量空间碎片。空间碎片过多时,将会给大对象分配带来很大的麻烦,往往会出现老年代还有很大的空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。为了解决这个问题,CMS收集器提供了一个-XX:+UseCMSCompactAtFullCollection开关参数,用于在“享受”完Full GC服务之后额外免费附送一个碎片整理过程,内存整理的过程是无法并发的。空间碎片问题没有了,但停顿时间不得不变长了。虚拟机设计者们还提供了另外一个参数-XX: CMSFullGCsBeforeCompaction,这个参数用于设置在执行多少次不压缩的Full GC后,跟着来一次带压缩的。
相关推荐
### We7CMS数据控件详解 #### 一、数据控件概述 数据控件,在We7CMS系统中扮演着至关重要的角色,它们相当于其他内容管理系统(CMS)中的“模板标签”。其主要功能在于动态地从数据库中提取并展示数据,为网站的...
【JVM中的CMS收集器详解】 CMS(Concurrent Mark Sweep)收集器,全称为"Mostly Concurrent Mark and Sweep Garbage Collector",是Java虚拟机(JVM)中一种旨在减少老年代(Old Generation)垃圾回收时停顿时间的...
综上所述,【帝国CMS会员中心签到领积分插件】是一个实用且有效的用户互动工具,通过签到功能,不仅能够增加用户活跃度,还可以收集用户行为数据,为网站运营提供有价值的参考。对于希望提高用户粘性的帝国CMS站点来...
### 帝国CMS二次开发帮助文档与资源地址收集 #### 概述 帝国CMS(EmpireCMS)是一款广泛应用于网站构建与管理的开源内容管理系统(CMS),它提供了丰富的功能和灵活的定制选项,适用于搭建各类网站。对于希望...
2-6垃圾收集器ParNew&CMS底层三色标记.mp4
《74cms人才系统从3.4到3.5企业版升级详解》 在IT行业中,网站内容管理系统(CMS)的升级是维护网站安全、优化功能及提升用户体验的重要环节。74cms作为一款广泛应用于人才招聘领域的CMS,其3.4版本到3.5版本的升级...
### CMS市场份额研究报告知识点详解 #### 一、研究报告概述 该报告是关于开源内容管理系统(Content Management System,简称CMS)在共享网站建设领域内的市场份额分析与对比研究。报告覆盖了2009年下半年的情况,...
**CMS内容管理系统详解** CMS(Content Management System,内容管理系统)是一种用于创建、管理和发布数字内容的软件工具。在本文中,我们将深入探讨CMS系统的核心功能、常见类型以及它如何帮助用户对门户网站和...
【ASP CMS系统详解】 ASP(Active Server Pages)是一种由微软开发的服务器端脚本环境,用于生成动态网页或Web应用程序。在本实例中,“asp做的小巧实用的cms系统”是一个基于ASP技术构建的小型内容管理系统(CMS)...
Serial Old收集器是Serial收集器的老年代版本,通常作为CMS收集器的备用方案。 2. ParNew收集器(-XX:+UseParNewGC) ParNew收集器是Serial收集器的多线程版本,同样适用于新生代,使用复制算法,但可以并行执行...
【CMS采集工具详解】 在数字化信息时代,内容管理系统(CMS,Content Management System)已经成为网站建设和管理的重要工具。而“cms采集工具”则是基于CMS系统的一种高效的信息获取与处理工具,它能够帮助用户...
#### 数据库表详解 1. **qs_ad广告表** - **说明**:存储广告相关信息,如广告图片、链接地址、展示位置等。 - **用途**:用于网站上各种广告的管理和展示。 2. **qs_admin管理员表** - **说明**:记录管理员...
【 CMS4J 帮助手册互动信息详解】 CMS4J 是一款强大的内容管理系统,其互动信息部分专注于提供多分类的留言与反馈功能,旨在帮助用户有效地管理和展示各种类型的互动内容。这一特性使得 CMS4J 不仅仅是一个单一的...
**PHP实现CMS内容管理系统详解** PHP(Hypertext Preprocessor)是一种广泛使用的开源脚本语言,尤其在Web开发领域,其灵活性和强大的功能使其成为构建动态网站和内容管理系统(CMS)的理想选择。CMS允许用户无需...
《PublicCMS协议详解》 PublicCMS,全称为“公共内容管理系统”,是一款开源的、免费的企业级网站内容管理系统,旨在帮助用户快速构建和管理网站。在分析"publiccms_agreement.zip"这个压缩包文件之前,我们需要...
《.Net 电子商务CMS建站详解》 在当今数字化的时代,电子商务已经成为企业不可或缺的一部分,而内容管理系统(CMS)则是构建高效、灵活电商网站的关键工具。本文将深入探讨使用.Net技术构建电子商务CMS建站的实践与...
3. **垃圾收集**:深入研究不同垃圾收集器(如Serial、Parallel、CMS、G1、ZGC等)的工作原理和优化策略。 4. **内存调优**:学习如何调整JVM的内存设置,包括新生代、老年代的大小,以及GC日志的分析。 5. **性能...
### ABB New CMS 多回路监测系统知识点详解 #### 一、系统介绍与功能特点 **CMS-770**是一款由ABB推出的多回路监测系统,主要用于记录最多8个独立线路的三相电参数。该系统具备高度集成性和灵活性,支持多种连接...
ParNew是Serial GC的多线程版本,主要在新生代进行工作,与CMS(Concurrent Mark Sweep)垃圾收集器配合使用,适合多CPU环境。它可以减少暂停时间,但可能会增加CPU使用率。 3. **Parallel GC** Parallel GC也...