CMS

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS收集器与之前的垃圾收集器最大的特点就是它可以并发清除垃圾。
他的工作流程如下:

  1. 初始标记(CMS initial mark)
  2. 并发标记(CMS concurrent mark)
  3. 重新标记(CMS remark)
  4. 并发清除(CMS concurrent sweep)
  • 其中初始标记、重新标记这两个步骤仍然需要“Stop The World”。初始标记仅仅只是标记一下GCRoots能直接关联到的对象,速度很快;
  • 并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行;
  • 而重新标记阶段则是为了修正并发标记期间,因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录(增量更新),这个阶段的停顿时间通常会比初始标记阶段稍长一些,但也远比并发标记阶段的时间短;
  • 最后是并发清除阶段,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。由于在整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

因为CMS垃圾收集器要求低延迟,在清理垃圾的时候要做到并发。所以它采用的是标记-清除算法。 这种算法必然回导致产生大量的空间碎片
这是他的一个缺点。
他还有两个缺点就是:

  • 对处理器资源非常敏感。
  • 无法处理浮动垃圾。

Garbage First(G1)收集器

Garbage First(简称G1)收集器是垃圾收集器技术发展历史上的里程碑式的成果,它开创了收集器面向局部收集的设计思路和基于Region的内存布局形式。
特点:

  • 全功能的垃圾收集器(老年代新生代都可使用)
  • 把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。
  • 垃圾收集的目标范围并不像其他垃圾收集器一样要么是整个新生代(Minor GC),要么就是整个老年代(Major GC),再要么就是整个Java堆(Full GC)。它可以面向堆内存任何部分来组成回收集(Collection Set,一般简称CSet)进行回收,衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大,这就是G1收集器的Mixed GC模式。
  • 能够支持指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标。
  • 让G1收集器去跟踪各个Region里面的垃圾堆积的“价值”大小,价值即回收所获得的空间大小以及回收所需时间的经验值,然后在后台维护一个优先级列表,每次根据用户设定允许的收集停顿时间(使用参数-XXMaxGCPauseMillis指定,默认值是200毫秒),优先处理回收价值收益最大的那些Region。
  • 整体用的标记-整理算法,每个region间用的标记-清除算法。
  • 它的每个Region都维护有自己的记忆集,来解决跨代引用。
  • 而对于那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humongous Region之中,G1的大多数行为都把Humongous Region作为老年代的一部分来进行看待

工作流程如下:

  • 初始标记(Initial Marking):仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS指针的值,让下一阶段用户线程并发运行时,能正确地在可用的Region中分配新对象。这个阶段需要停顿线程,但耗时很短,而且是借用进行Minor GC的时候同步完成的,所以G1收集器在这个阶段实际并没有额外的停顿。
  • 并发标记(Concurrent Marking):从GC Root开始对堆中对象进行可达性分析,递归扫描整个堆里的对象图,找出要回收的对象,这阶段耗时较长,但可与用户程序并发执行。当对象图扫描完成以后,还要重新处理SATB记录下的在并发时有引用变动的对象。
  • 最终标记(Final Marking):对用户线程做另一个短暂的暂停,用于处理并发阶段结束后仍遗留下来的最后那少量的SATB记录。(原始快照)
  • 筛选回收(Live Data Counting and Evacuation):负责更新Region的统计数据,对各个Region的回收价值和成本进行排序,根据用户所期望的停顿时间来制定回收计划,可以自由选择任意多个Region构成回收集,然后把决定回收的那一部分Region的存活对象复制到空的Region中,再清理掉整个旧Region的全部空间。这里的操作涉及存活对象的移动,是必须暂停用户线程,由多条收集器线程并行完成的。

G1收集器除了并发标记外,其余阶段也是要完全暂停用户线程的。包括筛选回收。G1不是仅仅面向低延迟,停顿用户线程能够最大幅度提高垃圾收集效率,为了保证吞吐量所以才选择了完全暂停用户线程的实现方案。
吞吐量 = 执行用户线程的时间/(执行用户线程时间 + 执行gc线程时间)。

CMS垃圾收集器和G1垃圾收集器相关推荐

  1. 27.垃圾收集器(Serial收集器、ParNew收集器、Parallel收集器、Parallel Old 收集器、CMS收集器、G1收集器、常用的收集器组合)

    27.垃圾收集器 27.1.Serial收集器 27.2.ParNew收集器 27.3.Parallel收集器 27.4.Parallel Old 收集器 27.5.CMS收集器 27.6.G1收集器 ...

  2. CMS收集器和G1收集器,优缺点对比

    点击上方关注"Java后端技术栈" 很多面试题都会涉及CMS收集器和G1收集器,这里面有一个非常重要的知识点:G1只有并发标记才不会stop-the-world,其他都会停下来. ...

  3. 一网打尽!CMS收集器和G1收集器的区别

    CMS 收集器 CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器.它非常符合在注重用户体验的应用上使用. CMS(Concurrent Mark S ...

  4. CMS收集器和G1收集器的区别

    目录 CMS收集器和G1收集器的区别 区别一: 使用范围不一样 区别二: STW的时间 区别三: 垃圾碎片 区别四: 垃圾回收的过程不一样 对于CMS收集器和G1收集器的不同,目前简单写了一下4点,有 ...

  5. CMS收集器与G1收集器

    说明:本文摘自<深入理解Java虚拟机>,是自己看书总结文章.以下正文开始 收集器中的***并行(Parallel)***语义:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态 收 ...

  6. CMS、G1垃圾收集器详解

    CMS垃圾收集器 基本上只能用在老年代,很长一段时间是ParNew(新生代)搭配CMS(老年代)来使用的. 收集过程大概会分为如下4个过程: 1.初始标记: 暂停所有的其他线程,并记录下gc root ...

  7. 详解cms和g1垃圾收集器

    G1 垃圾收集器架构和如何做到可预测的停顿(阿里) CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿 ...

  8. G1 垃圾收集器原理详解

    一.G1 垃圾收集器的开发背景: 1.CMS 垃圾收集器的缺陷: JVM 团队设计出 G1 收集器的目的就是取代 CMS 收集器,因为 CMS 收集器在很多场景下存在诸多问题,缺陷暴露无遗,具体如下: ...

  9. G1 垃圾收集器入门

    G1 垃圾收集器入门 概览 目的 这个教程覆盖了如何使用G1垃圾收集器和它是怎样被Hotspot JVM使用的,你会学到G1收集器内部是如何工作的,使用G1时的一些关键命令行开关和记录它的操作的一些选 ...

最新文章

  1. 电脑画画软件_手绘、板绘、还有用pad画画都有啥区别?
  2. python中ndarray和matrix
  3. Hadoop ssh配置设置
  4. python数组 swig_python中SWIG
  5. Pycharm无法安装第三方模块(模块已存在/换源)
  6. java实现分布式redis锁_使用redis实现分布式锁
  7. python bottle框架 重定向_Python的web框架bottle静态文件的路径
  8. xss攻击中受影响的是服务器还是客户端,安全测试基础之 XSS
  9. Android 8.1 频频被曝 Bug,是要赶超苹果吗?
  10. Typora使用技巧--不定期更新
  11. [已解决]Warning: Solver not found (cplex)
  12. 软件研发过程客观体检指标
  13. matlab coder分析
  14. Hive实现获取指定月的第一天和最后一天
  15. 摄像头驱动CAMERA SENSOR调试流程
  16. Windows——打印机错误(操作无法完成(错误 0x000006ba)。本地打印机后台处理程序服务没有运行。请重新启动打印机后台处理程序或重新启动计算机。)解决方案
  17. #ACCV2022还有两周截稿#疫情过后期待相聚澳门,相邀参与亚洲视觉盛会
  18. SyntaxError: Non-UTF-8 code starting with ‘\xb5‘ in file问题如何解决???求助求助!!!
  19. AE自带抠像插件解释
  20. 查看Window系统激活信息

热门文章

  1. 177本名著浓缩成了177句话!
  2. java swing 字体显示_如何在Java Swing中使用Wingdings字体
  3. PyQt5 使用 webdings,Wingdings 字体来替代某些常用图片
  4. 【数据结构(C语言描述)】环形队列
  5. 三星Galaxy S5手机在全球125个国家同步上市
  6. 2020-mac-东芝的移动硬盘插入到我的macbook pro系统上没反应,只是等在闪烁
  7. Pandas库的学习使用(一)
  8. 111. Minimum Depth of Binary Tree
  9. 使用C#.NET通过MAPI访问收件箱
  10. 想进BAT?这些测试面试题助你一臂之力(附答案)