说明:本文摘自《深入理解Java虚拟机》,是自己看书总结文章。以下正文开始

收集器中的***并行(Parallel)***语义:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态

收集器中的***并发(Concurrent)***语义:指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序于另一个CPU上。

###CMS收集器:
CMS(ConCurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器,从Mark-Sweep上可以看出,CMS收集器(以下简称CMS)是基于“标记-清除”算法实现的。主要应用于B/S模式的服务端(希望系统停顿时间尽可能短,尤其重视响应时间)
CMS的运作过程可以分为4个步骤

**1. 初始标记(CMS initial mark) **

**2. 并发标记(CMS concurrent mark) **

3. 重新标记(CMS remark)

4. 并发清除(CMS concurrent sweep)

  1. 详细说明:初始标记(CMS initial Mark)是需要“Stop The World”。初始标记仅仅只是标记一下GC Roots能关联到的对象,速度很快。

  2. 并发标记阶段就是进行GC Roots Tracing 的过程。

  3. 重新标记阶段:因为并发标记阶段用户程序继续执行,导致原先标记产生变动,所以需要对原先标记的记录进行修正。从这个作用可以看出,重新标记阶段和初始标记阶段同样需要“Stop The World”。这个阶段的停顿时间一般比初始标记阶段稍长一点,但远比并发标记的时间要短。

  4. 并发清除阶段:从前面的语义解释就可以看出,该阶段用户线程同垃圾清除线程同时执行(这里可以看出由于清除阶段用户线程还在运行, 自然就会产生新的垃圾(称为“浮动垃圾”), 因为新产生的垃圾在垃圾标记阶段之后,所以这部分新产生的垃圾CMS无法在本次收集过程中处理掉它们,只能留到下次GC时再清理)。

    ####CMS收集器的缺点

    1. 对CPU资源很敏感:CMS默认启动的回收线程数量是(CPU的个数+3)/4,如果CPU的个数在4个以上,
      收集器会占用不少于25%的CPU资源,CPU个数越多,收集器会占用不少于25%的CPU资源,
      CPU个数越多,CPU资源占比越小。但是当CPU不足4(例如2个)的时候,CMS收集器占用一半的运算能力去执行收集器线程。本来CPU负载就比较大,就会导致用户程序的执行效率下降的很明显。

    2. 无法处理浮动垃圾:由于最后的垃圾清除阶段是并发进行的,伴随着程序的运行产生的新的垃圾,在本次收集过程中无法处理掉,指的下次GC时再清理。
      而且还需要留足够的内存空间给用户线程使用,不能像其他收集器那样等到老年代几乎被填满了再进行收集,需要预留一部分空间提供并发收集时用户线程使用。

    3. 产生大量的空间碎片。CMS是基于“标记-清除”算法实现的收集器。因为这种算法在收集结束后有大量的空间碎片,当碎片过多时,会给大对象的内存
      分配带来很大麻烦,往往在老年代中还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象导致不得不提前触发一次Full GC。

###G1(Garbage First)收集器
面向服务端应用的垃圾收集器。G1名称由来:G1收集器,Java堆的内存布局是将整个Java堆分为多个大小相等的独立区域(Region),也保留了新生代
和老年代的概念。但是新生代和老年代不再是物理隔离的,它们都是一部分Region的集合。G1跟踪各个Region里面的垃圾堆积的价值大小(也就是回收获得的空间大小以及回收需要的时间的经验值),在后台维护一个优先列表,每次根据允许的的收集时间,优先回收价值最大的Region。

G1的运作过程大致划分为几个步骤

1. 初始标记(Initial Marking)

2. 并发标记(Concurrent Marking)

3. 最终标记(Final Marking)

4. 筛选回收(Live Data Counting and Evacuation)

  1. 详细说明第一步:初始标记(Initial Marking),同CMS收集器很相似,仅仅是标记一下GC Root能关联到的对象,这阶段需要停顿线程,但耗时很短。

  2. 并发标记(Concurrent Marking):是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时比较长,但是可与用户程序并发执行。

  3. 最终标记(Final Marking):为了修正在并发标记期间因为用户程序执行而导致标记产生变动的那一部分的标记记录。所以这个阶段同初始标记阶段一样需要"Stop The World"。可以并行执行(即最终标记线程同时执行)。

  4. 筛选回收(Live Data Counting Evacuation):首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。这个阶段也是"Stop The World"的。(这个阶段也可以做到同用户线程一起并发执行,因为只回收一部分Region时间是用户可控制的,停顿用户线程可以大幅提高收集效率。所以选择了“Stop The World”)。

    ####G1收集器的特点:

    1. 并行与并发:G1能充分利用多CPU,多核的硬件优势来缩短Stop—The—World停顿的时间,部分其它收集器原本需要停顿用户线程执行的GC动作,
      G1依然可以通过并发的方式让用户线程继续执行。

    2. 分代收集:同其它收集器一样,分代概念依然在G1中保留。G1可以不需要其它收集器配合就能独立管理整个GC堆,而且采用了不同的方式处理
      新创建的对象,已经存活一段时间的对象,熬过多次GC的旧对象,来获得更好的收集结果。

    3. 空间整合:使用算法从整体上来看是基于标记——整理实现的。局部来看,是基于“复制”算法实现的。所以G1在运作期间不会产生内存空间碎片,
      收集后能提供规整的可用内存。这有利于程序长时间运行。

    4. 可预测的停顿:G1同CMS都追求低停顿时间。但是G1还能建立可预测的停顿时间模型(通过有计划的避免在整个Java堆中进行全区域的垃圾收集,
      而是将整个Java堆分为多个大小相等的独立区域(Region),也保留了新生代和老年代的概念。但是新生代和老年代不再是物理隔离的,它们都是
      优先列表,每次根据允许的的收集时间,优先回收价值最大的Region。),能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集
      的时间上不超过N毫秒,这几乎是实时Java的垃圾收集器的特征。

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收集器的区别

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

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

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

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

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

  5. CMS垃圾收集器和G1垃圾收集器

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

  6. 直通BAT必考题系列:深入剖析JVM之G1收集器、及回收流程、与推荐用例

    金三银四马上到了,即将进入面试的高峰期.在BAT面试中,JVM基本都是必考的系列.你至少需要掌握JVM内存模型与JVM参数详细配置,JVM的4种垃圾回收算法.垃圾回收机制与总结,以及今天重点谈到的JV ...

  7. G1收集器和CSM收集器对比

    (http://blog.csdn.net/zhanggang807/article/details/45956325) 回顾分代垃圾回收和CMS 并发标记清除(CMS)收集器(也叫并发低延迟收集器) ...

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

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

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

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

最新文章

  1. mongodb的安装以及客户端
  2. 在SQL Server 2005中用存储过程实现搜索功能
  3. 初识Tcl(六):Tcl 数组
  4. Makefile for OpenCV
  5. iOS开发-项目的完整重命名方法,图文教程。
  6. 机器学习大牛是如何选择回归损失函数的?
  7. 「刘一哥GIS」系列专栏《QGIS入门实战精品教程(配套案例数据)》
  8. Java多线程面试题与答案
  9. mooc作业怎么上传附件_交作业的一二三
  10. android文件管理器项目,浅析Android文件管理器(项目一)
  11. 有个内含单词的超大文本文件_如果你家有个大阳台,你会选择封阳台吗?
  12. memcmp与strcmp区别
  13. 【算法篇】汉诺塔问题
  14. Linux下编译程序/usr/bin/ld: cannot find -l*错误的解决方法
  15. matlab 曲线 标注,请问关于Matlab曲线标注问题
  16. 计算机中的网络怎么共享的打印机驱动,如何共享打印机,如何设置打印机共享打印机共享设置图解-中关村在线...
  17. postman模拟并发请求
  18. Javascript学习:删除字符串中的数字
  19. 迭代速度慢?成熟的机器学习流如何设计:微博大规模机器学习框架Weiflow揭秘...
  20. Unity如何限制3D物体的旋转角度

热门文章

  1. 三星Note3添加S Note笔记模板教程
  2. H5测试点汇总整理,搞定面试不受虐
  3. MVC/MVVM模式特点及区别
  4. express,multer,jQuery前端后端上传单个文件
  5. C++ 简单工厂模式
  6. 如何系统性学习数据库知识? | 个人经验分享
  7. Struts2拦截器-day04下
  8. SVN服务器更换IP地址,客户端如何重新定位
  9. 认真看完就会系列——CentOS常用命令
  10. SQL Server 2005 企业版没有 Microsoft SQL Server Management