【GC收集器有哪些,介绍一下CMS和G1收集器?】

【GC收集器有哪些,介绍一下CMS和G1收集器?】
首先从GC的主要作用区域说起,GC主要发生于堆内存,而为了快速的完成GC,将堆内存分为了新生代和老年代,新生代占1/3;老年代占2/3;而新生代中,又将其划分为8/10的Eden区域,1/10的 from survivor区域和1/10的to survivor区域:
所以GC收集器主要分为三类,一种是新生代收集器:
serial收集器,这种收集器的收集算法是复制算法,是单线程的,也也就是说进行GC线程运行的时候,其他线程都要暂停运行,这种收集器适合单核系统,多核情况下浪费了资源;
还有ParNew收集器,这种收集器的是支持多个GC线程并行的,在多核模式下优于serial,单核模式下性能不如serial;
还有就是parallel Scavenge收集器,这种收集器也称之为吞吐量优先收集器,比较注重吞吐量,支持多线程,使用复制算法;
在老年代中常用的收集器有:
serial Old 是serial在老年代中的收集版本,使用的算法是标记-整理算法;
parallel old收集器,是parallel Scavenge的老年代收集版本,使用标记整理算法;
CMS收集器,这种收集器使用标记-清除算法,CMS的特点是低停顿GC,用户体验较好,CMS支持多线程,其GC分为四步:
初始标记:标记老年代存活的对象(会有短暂stw);
并行标记 : GC线程与用户线程并发运行;
重新标记: 由于在并行标记的过程中用户线程运行会产新的垃圾需要回收,所以需要再次标记
并行清除:GC线程与用户线程并发运行,GC线程清除垃圾;
由于CMS是采用标记-清除算法,所以会产生不能复用的内存碎片,所以CMS提供了一个机制,在CMS快支持不住的时候,默认执行UseCMSCompactAtFullCollection进行内存碎片合并 ;还有一点就是,由于是并行清除,所以可能会在清除的同时,用户线程会产生垃圾,这称之为浮动垃圾,会导致Full GC;还有一点就是,由于CMS运行线程和应用程序并发执行需要多核CPU,所以初始的时候,需要启动(CPU数量+3)/4个GC线程,如果CPU运算压力较大,还要分给CMS运作,这可能会在很大程度上影响计算机性能;

非新生代非老年代GC收集器:G1 ;G1收集器强化了分区,弱化了分代的概念,G1收集器将堆内存分为了1M~32M的region;是区域化,增量式的收集器;采用的算法是标记-清除;复制算法;g1通过并发(并行)标记阶段查找老年代存活对象,通过并行复制压缩存活对象【这样可以省出连续空间供大对象使用】。

g1将一组或多组区域中存活对象以增量并行的方式复制到不同区域进行压缩,从而减少堆碎片,目标是尽可能多回收堆空间【垃圾优先】,且尽可能不超出暂停目标以达到低延迟的目的。

g1提供三种垃圾回收模式 young gc、mixed gc 和 full gc,不像其它的收集器,根据区域而不是分代,新生代老年代的对象它都能回收。

参考:https://www.jianshu.com/p/76959115d486