CMS收集器
目标:获取最短回收停顿时间。
优点:并发收集,低停顿
缺点:
①对处理器资源非常敏感:在并发阶段,它虽然不会导致用户线程停顿,但却会因为占用了一部分线程而导致应用程序变慢,降低总吞吐量。
②无法处理“浮动垃圾”:CMS的并发标记和并发清除阶段用户线程不会停止,会继续产生垃圾对象,这部分垃圾是出现在标记之后的,CMS无法当次处理掉,只能等下次。还有就是由于垃圾收集阶段用户线程没有停止,需要预留足够空间给用户线程使用,因此CMS不能像其他收集器一样等到老年代几乎完全填满后在进行收集。
互联网网站或基于浏览器的B/S系统通常会比较关注服务的响应速度(能够给用户更好的交互体验),CMS就很符合这类应用的要求。
基于标记清除。
③产生空间碎片:CMS基于标记-清除算法,垃圾收集结束后可能会有大量空间碎片产生。
运作过程比其他收集器更复杂。分为四步:
①初始标记(Stop-The-World):标记GC Root能够直接关联到的对象,速度很快。
②并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,耗时长,但是不需要停顿用户线程,可以与垃圾收集线程一起并发运行。
③重新标记(Stop-The-World):因为并发标记不需要stop-the-world,所以并发标记期间,用户程序继续运作导致一部分对象的标记产生变动,重新标记就是为了修正这部分对象的标记记录。停顿时间会比初始标记长一些
④并发清除:,清理删除掉标记阶段判断的已经死亡的对象,由于不需要移动存活对象,所以这个阶段也是可以与用户线程同时并发的。
整个过程中耗时最长的并发标记和并发清除阶段中,垃圾收集器线程都可以与用户线程一起工作,所以从总体上来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。
Garbage First收集器
简介:
简称G1收集器,是垃圾收集器技术发展历史上的里程碑式的成果,开创了收集器面向局部收集的设计思路和基于Region的内存布局形式,虽然G1还是遵循分代收集理论,但是它不在坚持固定大小以及固定数量的分代区域划分,而是把连续的java堆划分为多个大小相等的独立区域(Region),每个Region都可以根据需要去扮演新生代的Eden空间,Survivor空间或者老年代空间。
G1收集器是一款面向服务端的垃圾收集器,专门针对拥有多核处理器和大内存的机器,满足高吞吐的同时,还满足GC停顿的时间尽可能短
JDK9之后,G1取代Parallel Scavenge加Parallel Old组合,成为服务端模式下默认垃圾收集器,取代了CMS。
G1收集器和CMS的区别:
首先是适用范围不一样,CMS是老年代收集器,可以配和新声代的Serial和ParNew收集器一起使用,而G1收集器收集范围是老年代和新生代,不需要结合其他收集器。还有就是使用的算法不同,CMS上使用的是标记-清除算法,G1使用的是标记-整理和标记-复制算法。还有就是CMS收集器会产生内存碎片,G1不会产生,还有回收过程也不一样,CMS:初始标记--->并发标记--->重新标记--->标记清除,G1:初始标记--->并发标记--->最终标记--->筛选回收,从用户线程停顿时间来说,CMS会停顿两次(初始标记和重新标记),G1会停顿3次(初始标记,最终标记,筛选回收)
CMS 是一个整体,再对整体进行操作的时候,整体都得停掉,而G1收集器是把存储分成一块一块的小区域,这些小区域每一块可以独立回收内存,回收一块的时候,其他区域的程序依旧会正常运行,不会产生 stop the world,所以 G1 收集器比较适合那种大内存的服务器。