java面试题网站:www.javaoffers.com
-
jvm垃圾回收器之CMS收集器
- cms收集器 (Concurrent Mark Sweep 并发标记删除)
-
cms收集器
-
摘要
CMS (Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。目前很大一部分的 Java应用集中在互联网站或者B/S系统的服务端上, 这类应用尤其重视服务的响应速度,希望系统停顿时间最短,以给用户带来较好的体验。CMS收集器就非常符合这类应用的需求。
-
学习cms收集器之前带着问题去学习
- cms收集器在执行时都包含那几个步骤
- cms收集器的优点和缺点是什么
- 为什么会出现concurrent mode failure (并发模式失败)
- -XX: CMSInitiatingOccupancyFraction, -XX: +UseCMSCompactAtFullCollection,-XX: CMSFullGCsBeforeCompaction 这三个参数的作用?
-
cms收集器在执行时都包含那几个步骤?
1.初始标记(CMS initial mark)(用户线程暂停,等待初始标记完成) :仅仅只是标记一下GC Roots能直接关联到的对象,速度很快,仍然需要 ‘stop the world’。 2.并发标记 (CMSconcurrent mark)(与用户线程并行执行) : 是进行GC RootsTracing(GC Root提取要被回收的对象)的过程。 3.再次标记 (CMS remark)(用户线程暂停,等待再次标记完成):目的是为了修正并发标记期间仍然有用户线程在执行而导致一部分记录内容(可以理解为对象的引用状态)的改变。 仍然需要 ‘stop the world’。而且可能比初始标记的时间要长。但是会比并发标记要短。 4.并发清除 (CMSconcurrent sweep)(与用户线程并行执行):将标记后的内容并发清除。 总结:cms收集器的执行步骤需要经过3次标记1次清除, 路程图如下:
-
cms收集器的优点和缺点是什么?
优点: 并发收集,低延迟。 缺点: 1.对cpu资源敏感(因为并发设计,在并发操作下默认使用(cpu核数+3)/ 4,因此cpu核数多的情况效率会高,如果cpu少,比如为1,则效率会非常慢,)。 2.cms无法处理浮动垃圾(指在并发清除时,用户线程仍然在运行并且产生的垃圾不能在这次的并发清除的动作中进行清除称为浮动垃圾),有可能会导致concurrent mode failure (并发模式失败)。 3.cms是基于‘标记-清除’的思想进行实现。所以会产生内存碎片。
-
为什么会出现concurrent mode failure (并发模式失败)?
cms收集器与用户线程并发执行时(用户线程在执行时会产生垃圾),有可能会造成内存严重不足(比如cms还没有启动时,老年代的内存已经达到90%),并导致cms收集器中断从而产生 concurrent mode failure (并发模式失败) 。但是jvm对cms收集器对此做了优化(注意是优化并不是完全可以避免)。这优化就是参数 -XX: CMSInitiatingOccupancyFraction 的意义。下面会进行讲解。
- -XX: CMSInitiatingOccupancyFraction, -XX: +UseCMSCompactAtFullCollection,-XX: CMSFullGCsBeforeCompaction 这三个参数的作用?
- -XX: CMSInitiatingOccu仅在cms收集器有效pancyFraction
该参数是为了优化由内存不足而导致的concurrent mode failure (并发模式失败)问题,本质上是设置老年代触发cms收集器执行的时机。这个时机是指老年代内存所使用的百分比 达到多少时进行触发cms收集器的执行。设置不同版本有不同的默认值,注意:太大可能会导致大量的concurrent mode failure (并发模式失败)问题, 太小会导致频繁的执行 cms收集器执行。所以该值设置到大小要结合自己的应用。大部分情况下会使用默认。(当cms收集器因内存不足而导致的大量失败时,jvm会启动Serial old 收集器重新对老年代进行垃圾收集)
- -XX: +UseCMSCompactAtFullCollection, -XX: CMSFullGCsBeforeCompaction
这两个参数都是用于优化cms垃圾收集器所产生的内存碎片。-XX: +UseCMSCompactAtFullCollection:是指在cms收集器执行完后是否要进行一次内存谁篇整理(仅在cms收集器有效)。 -XX: CMSFullGCsBeforeCompaction:指在cms收集器经过多少次后进行一次内存碎片的整理。(仅在cms收集器有效),默认为0,每次都会进行内存碎片整理。
- -XX: CMSInitiatingOccu仅在cms收集器有效pancyFraction
-