1、Serial收集器(串行)

     一个单线程的垃圾回收器,使用复制算法,在jdk1.3.1之前也是新生代唯一可以使用的垃圾回收器。单线程不仅仅只说明它只用一个cpu或一个收集线程去完成收集工作,关键是在其进行垃圾回收的时候,

    会停止到所有其他的工作线程,直到它的收集工作完成。

    缺点:每次收集的时候,都会运用的停顿,给用户的体验不好

    优点:简单高效,没有线程的而外开销,专心的干垃圾回收工作,在一个一般在系统里边,分配给虚拟机的内存管理不会很大,如果只是收集几十兆到一两百兆的新生代,jvm停顿的时间可以控制在

    几十毫秒到几百毫秒,对于用户而言,这样的卡顿基本也是完全可以接受的,所以Serial收集器仍然是clients模式下jvm默认的新生代垃圾回收器。

2、ParNew收集器(Serial多线程版)

     ParNew是Serial的多线程版本,除了多线程,其他的基本和Serial收集器一样。ParNew收集器是除了Serial收集器外唯一一个能和GMS收集器配合工作。GMS是一个并行的垃圾回收器,在不停止用

     户线程的情况下完成垃圾回收工作。

3、Parallel Scavenge收集器(并行清除)

     Parallel Scavenge收集器也是新生代的垃圾回收器,多线程的,和ParNew类似,但是它关注的点是达到一个可控制的吞吐量(运行代码时间/(运行代码时间+回收垃圾时间))。

     用户交互多的话,可以适当的调整MaxGCPauseMills的大小,调高吞吐量,停顿的时间降低,但是停顿的时间缩短是牺牲新生代空间来进行的,所以有可能GC的更加频繁,所以不宜调整的过小。

     对于计算型的应用,用户交互的比较少,可以长时间运算之后在进行一次比较长时间的垃圾回收。

4、Serial Old收集器

     Serial Old收集器是Serial的老年代版本,采用了标记整理的算法。

5、Parallel Old收集器

    Parallel Old是 Parallel Scavenge的老年代版本,也是采用了标记整理的算法

6、CMS收集器

     CMS收集器是一个获取最短回收停顿时间为目标的的垃圾回收器,基于标记-清除算法,主要有四个步骤 1、初始标记 2、并发标记 3、从新标记4、标记清除。

     初始标记和重新标记还是要停止用户线程的,其他两个步骤是可以和用户线程同时工作的。

     缺点:①对cpu资源比较敏感,并发操作的同时会影响到用户线程的工作效率②无法清除浮动的垃圾,并发清除的同时,jvm可能同时会产生很多新的垃圾,这些只有等到下一次垃圾回收

               ③采用了标记-清除算法,可能会对内存产出很多空间碎片,提前触发full gc。

7、G1收集器

     G1是一款面向服务端的应用垃圾收集器。相比其他收集器有以下特点:

     ①并行和并发,可以充分利用多cpu和多核的硬件优势,来缩短GC时的停顿时间,部分收集器需要停顿工作线程的GC动作,G1通过并发的方式让Java程序进行进行。

     ②分代收集,G1可以不需要其他垃圾收集器的配合独立管理整个GC堆,采用不同的方式去管理新建的对象和已经存活一段时间和熬过多次GC的旧对象。

     ③空间整合,G1整体采用的是标记-整理算法,局部使用复制算法,所以对于G1收集器以上两种算法都不会形成空间碎片,所以在分配大的对象时,不会找不到足够大的连续的内存空间

     ④可预测的停顿,G1在追求低停顿的外还可以建立可预测的停顿时间模型,使用者可以明确指定一个长度M毫秒的时间片段内,消耗在垃圾回收上的不超过N毫秒。