什么是Stop The World

不管选择哪种GC算法,stop-the-world都是不可避免的。Stop-the-world意味着从应用中停下来并进入到GC执行过程中去。一旦Stop-the-world发生,除了GC所需的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。GC调优通常就是为了改善stop-the-world的时间

CMS收集器

一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“”标记–清除”(Mark-Sweep)算法实现的。

整个过程分为四个步骤:

​ 1. 初始标记 (Stop the World事件 CPU停顿, 很短) 初始标记仅标记一下GC Roots能直接关联到的对象,速度很快;

​ 2. 并发标记 (收集垃圾跟用户线程一起执行) 初始标记和重新标记任然需要“stop the world”,并发标记过程就是进行GC Roots Tracing的过程;

​ 3. 重新标记 (Stop the World事件 CPU停顿,比初始标记稍微长,远比并发标记短)修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,这个阶段的停顿时间一般会比初始标记阶段稍长一些,但远比并发标记时间短

​ 4. 并发清理 -清除算法;

整个过程中耗时最长的并发标记和并发清除过程收集器线程都可以与用户线程一起工作,所以,从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

初始标记:仅仅是标记一下GC roots 能直接关联的对象,速度很快 (何为GC roots :

在Java语言中,可作为GC Roots的对象包括4种情况:

a) 虚拟机栈中引用的对象(栈帧中的本地变量表);

b) 方法区中类静态属性引用的对象;

c) 方法区中常量引用的对象;

d) 本地方法栈中JNI(Native方法)引用的对象。

优点

1.并发收集

2.低停顿

理由:

由于在整个过程和中最耗时的并发标记和 并发清除过程收集器程序都可以和用户线程一起工作,所以总体来说,Cms收集器的内存回收过程是与用户线程一起并发执行的

缺点

1.CMS收集器对CPU资源非常敏感

在并发阶段,虽然不会导致用户线程停顿,但是会因为占用了一部分线程使应用程序变慢,总吞吐量会降低,为了解决这种情况,虚拟机提供了一种“增量式并发收集器”

的CMS收集器变种, 就是在并发标记和并发清除的时候让GC线程和用户线程交替运行,尽量减少GC 线程独占资源的时间,这样整个垃圾收集的过程会变长,但是对用户程序的影响会减少。(效果不明显,不推荐)

2.CMS处理器无法处理浮动垃圾

CMS在并发清理阶段线程还在运行, 伴随着程序的运行自然也会产生新的垃圾,这一部分垃圾产生在标记过程之后,CMS无法再当次过程中处理,所以只有等到下次gc时候在清理掉,这一部分垃圾就称作“浮动垃圾” ,

3.CMS是基于“标记–清除”算法实现的,所以在收集结束的时候会有大量的空间碎片产生。空间碎片太多的时候,将会给大对象的分配带来很大的麻烦,往往会出现老年代还有很大的空间剩余,但是无法找到足够大的连续空间来分配当前对象的,只能提前触发 full gc。 为了解决这个问题,CMS提供了一个开关参数,用于在CMS顶不住要进行full gc的时候开启内存碎片的合并整理过程,内存整理的过程是无法并发的,空间碎片没有了,但是停顿的时间变长了

G1(Garbage First)

优先处理那些垃圾多的内存块,G1只有并发标记才不会stop-the-world 其他都会停下来

步骤:

1、初始标记(stop the world事件 CPU停顿只处理垃圾);

2、并发标记(与用户线程并发执行);(不会触发stop the world事件)

3、最终标记(stop the world事件 ,CPU停顿处理垃圾);

4、筛选回收(stop the world事件 根据用户期望的GC停顿时间回收); (注意:CMS 在这一步不需要stop the world)

与其他GC收集器相比,G1具备如下特点:

1、并行于并发:G1能充分利用CPU、多核环境下的硬件优势,使用多个CPU(CPU或者CPU核心)来缩短Stop-The-World停顿时间。部分其他收集器原本需要停顿Java线程执行的GC动作,G1收集器仍然可以通过并发的方式让java程序继续执行。

2、分代收集:虽然G1可以不需要其他收集器配合就能独立管理整个GC堆,但是还是保留了分代的概念。它能够采用不同的方式去处理新创建的对象和已经存活了一段时间,熬过多次GC的旧对象以获取更好的收集效果。

3、空间整合:与CMS的“标记–清理”算法不同**,G1从整体来看是基于“标记-整理”算法实现的收集器;从局部上来看是基于“复制”算法实现的**。

4、可预测的停顿:这是G1相对于CMS的另一个大优势,降低停顿时间是G1和CMS共同的关注点,但G1除了追求低停顿外,还能建立可预测的停顿时间模型,能让使用者明确指定在一个长度为M毫秒的时间片段内。

上面几个步骤的运作过程和CMS有很多相似之处。初始标记阶段仅仅只是标记一下GC Roots能直接关联到的对象,并且修改TAMS的值,让下一个阶段用户程序并发运行时,能在正确可用的Region中创建新对象,这一阶段需要停顿线程,但是耗时很短,并发标记阶段是从GC Root开始对堆中对象进行可达性分析,找出存活的对象,这阶段时耗时较长,但可与用户程序并发执行。而最终标记阶段则是为了修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录,虚拟机将这段时间对象变化记录在线程Remenbered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set Logs里面,最终标记阶段需要把Remembered Set Logs的数据合并到Remembered Set中,这一阶段需要停顿线程,但是可并行执行。最后在筛选回收阶段首先对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。

如果大家对java架构相关感兴趣,可以关注下面公众号,会持续更新java基础面试题, netty, spring boot,spring cloud等系列文章,一系列干货随时送达, 超神之路从此展开, BTAJ不再是梦想!

什么是STW以及CMS和G1优缺点?相关推荐

  1. 别总说CMS、G1,该聊聊ZGC了

    在开始介绍前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同.有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器.一般来说,新生代收集器的收集频率较高 ...

  2. JVM学习(十四):垃圾收集器(万字介绍CMS、G1)

    目录 一.垃圾收集器们 二.CMS(Concurrent-Mark-Sweep):低延迟 2.1 什么是CMS 2.2 CMS工作流程 2.3 详细描述 2.4 CMS的优缺点 2.4.1 优点 2. ...

  3. JVM从入门到精通(十):垃圾回收算法串讲:CMS,G1,三色标记算法

    CMS 并发回收,工作线程和GC线程同时进行,暂停时间短 老年代 分为 四个阶段: 初始标记:需要STW,因为初始的垃圾并不多,因此耗费的时间不长 并发标记:垃圾回收线程和工作线程同时执行.一边产生垃 ...

  4. 【重难点】【JVM 03】CMS、G1、ZGC

    [重难点][JVM 03]CMS.G1.ZGC 文章目录 [重难点][JVM 03]CMS.G1.ZGC 一.CMS 1.介绍 2.优点 3.缺点 二.G1 1.介绍 2.优势 3.应用场景 4.Re ...

  5. 弄明白CMS和G1,就靠这一篇了

    在开始介绍CMS和G1前,我们可以剧透几点: 根据不同分代的特点,收集器可能不同.有些收集器可以同时用于新生代和老年代,而有些时候,则需要分别为新生代或老年代选用合适的收集器.一般来说,新生代收集器的 ...

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

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

  7. java g1 详解_JAVA垃圾收集算法总结以及CMS、G1算法详解

    前段时间由于工作原因一直很忙,上周项目验收后时间终于空闲下来,博客也有好几个月没有更新了,趁着还有几天放假,借这个机会写点东西:网上也有很多人写过Java垃圾收集器,特别现在主流比较火的CMS和G1算 ...

  8. cms 和 g1的主要区别

    cms和g1的主要区别 1.cms是内存分布式分代连续的,也就是新生代一块连续的区间,年老代一块连续的区间,而g1是把堆分成了2048个region,每个区域region可以作为新生代也可以作为年老代 ...

  9. JVM之垃圾收集器CMS和G1的区别

    CMS和G1的区别 CMS 是作用于老年代 G1作用于堆 CMS:以获取最短回收停顿时间为目标的收集器,基于并发"标记清理"实现 过程: 1.初始标记:独占PUC,仅标记GCroo ...

最新文章

  1. 【camera-lidar-radar】基于卡尔曼滤波和扩展卡尔曼滤波的相机、激光雷达、毫米波雷达多传感器后融合
  2. RedHat 5.4 RHCE DHCP学习笔记
  3. 【转】维护工厂库存的一般设置
  4. 统计各个函数的耗时_Prometheus 常用函数 histogram_quantile 的若干“反直觉”问题...
  5. 局部变量和成员变量的初始值问题
  6. 状态模式(c++实现)
  7. 加入百度地图遇到 framework not found BaiduMapAPI***
  8. postman使用记录,带cookie的get请求和传json对象的post请求示范
  9. iphone小圆点在哪儿设置_iPhone终于自带长截屏了?苹果手机这些截图方式,你用过几种?...
  10. cdlinux之U盘启动cdlinux破解wifi(计算机系破解无线密码的方式 就不使用wifi万能钥匙了)-- 没有发现无线网卡
  11. 新手自己搭建服务器步骤
  12. 微信群总是有人发广告?看我用Python写一个自动化机器人消灭他!
  13. 高校大数据专业教学实训资源解决方案
  14. KDC+NFS 服务配置
  15. 完美起点更重要:青立方超融合易捷版 助力企业一步云就绪
  16. 微信支付查询订单V2 接口
  17. 图片怎么转为html格式,ps图片怎么转换为html ps图片转换为html图文教程
  18. ecshop数据结构
  19. pytest接口自动化测试框架 | 用python代码测试接口
  20. 关于论文查重的相关知识

热门文章

  1. Leetcode 577
  2. 577. 员工奖金 难度:简单
  3. 信息学奥赛一本通(C++版)第一部分 C++语言 第五章 数组
  4. python3插值法
  5. 小菜鸟的python进阶之路 ------- for循环打印四种形式的星星
  6. Autodesk PowerShape Ultimate 2021中文版
  7. cmstop传递什么控制器和方法---就实例化该控制器
  8. 平面的截距式方程推导
  9. ConfigUtility
  10. 花式索引与np.ix_函数