本文部分摘自《深入理解 Java 虚拟机第三版》

概述

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。由于大部分 Java 应用主要集中在互联网网站以及基于浏览器的 B/S 系统的服务端,这类应用通常会较为关注服务的响应速度,希望系统的停顿时间尽可能少,CMS 收集器就非常符合这类应用的需求

步骤

从名字可以知道,CMS 收集器是基于标记 - 清除算法实现的,它的运作过程分为四个步骤:

  1. 初始标记(CMS initial mark)

    仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要 Stop The World

  2. 并发标记(CMS concurrent mark)

    就是从 GC Roots 的直接关联对象开始遍历整个对象图的过程,耗时较长,但不需要停顿用户线程,可与垃圾收集器线程一起并发执行

  3. 重新标记(CMS remark)

    该阶段是为了修正并发标记期间,因用户程序运作而导致标记产生变动的那一部分对象的标记记录,这个阶段需要 Stop The World,而且停顿时间通常比初始阶段稍长一些,但也远比并发标记阶段的时间短

  4. 并发清除(CMS concurrent sweep)

    清理删除掉标记阶段判断已经死亡的对象,由于不需要移动存活对象,所有这个阶段可以和用户线程并发执行

由于整个过程中耗时最长的是并发标记和并发清除阶段,而这两个阶段都可以和用户线程并发执行,所以从总体上看,CMS 收集器内存回收过程是与用户线程一起并发执行的

CMS 收集器的不足

CMS 收集器的主要优点就是:并发收集、低停顿,因此也称 CMS 收集器为并发低停顿收集器。但 CMS 还远未达到完美的程度,它至少有以下四个明显的缺点:

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

    在并发阶段,CMS 虽然不会导致用户线程停顿,但却会因为占用了一部分线程(或者说是处理器的计算能力)而导致应用程序变慢,降低吞吐量。处理器核心数在四个或以上那还好,如果不足四个,CMS 会占用将近一半的运算能力去执行收集器线程,这将导致用户程序的执行效率大幅降低

  2. 无法处理浮动垃圾

    在 CMS 的并发标记和并发清理阶段,由于用户线程继续运行,因此有可能会有新的垃圾对象产生。但这一部分垃圾对象是出现在标记结束之后,CMS 无法在当次收集中处理掉它们,只能留待下一次垃圾收集在清理,这一部分垃圾就称为浮动垃圾

  3. 可能会出现并发失败

    同样也是由于垃圾收集阶段用户线程还需持续执行,那就必须预留足够的内存空间供用户线程使用。因此 CMS 收集器不能像其他收集器那样等老年代几乎完全填满再进行收集,而必须预留一部分空间供并发收集时的程序运作使用,这部分空间的大小可以通过 -XX:CMSInitiatingOccu-pancyFraction 参数来设置。如果 CMS 运行期间预留的内存无法满足程序分配对象的需要,就会出现一次并发失败,这时虚拟机不得不启用预备方案:冻结用户线程,临时启用 Serial Old 收集器来重新进行老年代的垃圾收集,导致 Stop The World

  4. 大量空间碎片的产生

    CMS 是一款基于标记 - 清除算法实现的收集器,这也意味着收集结束时会产生大量空间碎片。为了解决这个问题,CMS 收集器提供了一个 -XX:+UseCMS-CompactAtFullCollection 开关参数,用于在收集结束后做一次内存整理,以及 -XX:CMSFullGCsBefore-Compaction 参数,要求 CMS 收集器在执行若干次不整理空间的 Full GC 之后,下一次 Full GC 前先做一次碎片整理

JVM 经典垃圾收集器 —— CMS 收集器的更多相关文章

  1. JVM垃圾回收之CMS收集器

    从前文JVM垃圾回收几种常见算法和常见收集器我们知道,CMS是老年代垃圾收集器.CMS 收集器主要关注系统停顿时间.CMS 是 Concurrent Mark Sweep 的缩写,意为并发标记清除,从 ...

  2. JVM实用参数(七)CMS收集器

    HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器 ...

  3. 垃圾收集器之:CMS收集器

    HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间.该目标对于大多数交互式应用很重要,比如web应用.在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器 ...

  4. JVM垃圾收集器-ParNew收集器

    今天我给大家讲讲ParNew收集器. ParNew收集器 ParNew收集器收集器其实就是Serial收集器的多线程版本,除了使用多线程进行垃圾收集之外,其余行为包括Serial收集器可用的所有控制参 ...

  5. CMS收集器和G1收集器

    CMS收集器 CMS收集器是一种以获取最短回收停顿时间为目标的收集器.基于"标记-清除"算法实现,它的运作过程如下: 初始标记 并发标记 重新标记 并发清除 初始标记.从新标记这两 ...

  6. JVM 经典垃圾收集器

    本文部分摘自<深入理解 Java 虚拟机第三版> 概述 如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的实践者.Java 虚拟机规范中对垃圾收集器的实现做出规定,因此不同的厂 ...

  7. JVM垃圾收集器-G1收集器

    G1收集器是当前收集器技术发展的最前沿成果,在JDK1.6_Updata14中提供了Early Access版本的G1收集器以供适用.G1收集器是垃圾收集器理论进一步发展的产物,它与前面的CMS收集器 ...

  8. 【JVM】垃圾收集器和收集器的选择策略

    前言:新生代的收集器有:Serial,ParNew,Parallel Scavenge等.老年代有:CMS,SerialOld,Paraller Old等.接下来将深入理解各个垃圾收集器的原理,以及它 ...

  9. JVM经典垃圾收集器

      这个关系不是一成不变的,由于维护和兼容性测试的成本,在JDK 8时将Serial+CMS. ParNew+Serial Old这两个组合声明为废弃(JEP 173),并在JDK 9中完全取消了这些 ...

随机推荐

  1. Forethought Future Cup - Final Round (Onsite Finalists Only) C. Thanos Nim 题解(博弈+思维)

    题目链接 题目大意 给你n堆石子(n为偶数),两个人玩游戏,每次选取n/2堆不为0的石子,然后从这n/2堆石子中丢掉一些石子(每一堆丢弃的石子数量可以不一样,但不能为0),若这次操作中没有n/2堆不为 ...

  2. C语言编程学习者问答第一期,看看这些问题你出现过吗?

    今天给大家分享我们学习基地的小伙伴遇到的问题,以及正确回答,看看这些问题你遇到过吗~ 1.这张图片文字"第二段"后面的说法是否有问题?   回答: 这是二进制的加法,很多人会误解减 ...

  3. Python基于Socket实现简易多人聊天室

    前言 套接字(Sockets)是双向通信信道的端点. 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器. 套接字可以通过多种不同的 ...

  4. PyCharm中怎么将非当前工程文件的目录的文件加到当前工程中

    在PyCharm已经建立工程文件的情况下,如果要将一个其他目录的文件导入到已有的工程中,唯一的方法如下: 通过File->Settings->Project->Project Str ...

  5. 开源版本Visifire的应用

    Visifire曾经开源,保持使用开源版本是不会有版权问题滴. 引用的命名控件 using Visifire.Charts; using Visifire.Commons; 一.应用示例主要代码 // ...

  6. PHP代码审计分段讲解(12)

    28题 <!DOCTYPE html> <html> <head> <title>Web 350</title> <style typ ...

  7. python调用jar包

    工作项目中用jmeter做接口测试,想尝试用python写接口测试(练习下python), 接口中好多字段都需要加密,而加密方法是java开发写的,打的jar包,这就需要考虑python调用java: ...

  8. python 保存list,map方法

    1. 保存list import numpy as np a = [1,2,3,4,5] np.save("number.npy", a) k = np.load("nu ...

  9. CSMA系列区别比较:p-pCSMA;CSMA/CA;CSMA/CD

    CSMA系列小结 CSMA,又称载波侦听多路访问协议.在计算机网络课程中,其一共有四个基础协议与两个实际应用(分别是802.11和802.3) 忙 空闲 传输冲突 应用 1-p CSMA 持续侦听,等 ...

  10. 【杂记】CSP-S 2020 游记 &反思

    考场经历 吐槽:为什么这个 Enter 的位置怎么诡异啊老是打错.要是考挂了就怪你 开场当然先看了 T1,发现是个日期转换,果然是个百出不厌的模拟题类型,估价细节多到爆炸.看了几分钟题目,对这些规则云 ...