一张图表示经典垃圾收集器:

1. Serial 收集器
Serial 收集器是最基础、历史最悠久的收集器。这个收集器是一个单线程工作的收集器, 但它的“单线程”的意义并不仅仅是说明它只会使用一个处理器或一条收集线程去完成垃圾收集工作, 更重要的是强调在它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束 (STW)。

Serial 是 HotSpot 虚拟机运行在客户端模式下的默认收集器, 优点:简单高效,对于运行在客户端模式下的虚拟机来说是—个很好的选择; 缺点: 在不可知不可控的情况下停止所有线程对于许多应用来说是不能接受的。
2. ParNew 收集器
ParNew收集器实质上是 Serial 收集器的多线程并行版本,除了同时使 用多条线程进行垃圾收集之外, 其余的行为包括 Serial 收集器可用的所有控制参数与 Serial 收集器完全一致。
除了 Serial 收集器外, 目前只有它能与 CMS 收集器配合工作。

3. Parallel Scavenge 收集器
Parallel Scavenge 收集是新生代收集器,基于标记-复制算法实现,也能够并行收集。 Parallel Scavenge 的关注点与其他收集器不同,CMS 等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而 Parallel Scavenge 收集器的目标则是达到一个可控制的吞吐量 (Throughput)。所谓吞吐量就是处理器用于运行用户代码的时间与处理器总消耗时间的比值。高吞吐量则可以最高效率地利用处理器资源尽快完成程序的运算任务。
Parallel Scavenge 收集器提供了两个参数用于精确控制吞吐量, 分别是控制 最大垃圾收集停顿时间的-XX: MaxGCPauseMillis 参数以及直接设置吞吐量 小的-XX: GCTimeRatio 参数。由于与吞吐量关系密切, Parallel Scavenge 收集器也经常被称作“吞吐量优先收集器”。自适应调节策略也是 Parallel Scavenge 收集器 区别于 ParNew 收集器的一个重要特性。
4. Serial Old 收集器
Serial Old 是 Serial 收集器的老年代版本,, 主要意义也是供客户端模 式下的 HotSpot 虚拟机使用。如果在服务端模式下, 它也可能有两种用途: —种是在 JDK 5 以及之前的版本中与 Parallel Scavenge 收集器搭配使用, 另外—种就是作为 CMS 收集器发生失败时的后备预案, 在并发收集发生Concurrent Mode Failure 时使用。

5. Parallel Old 收集器
Parallel Old 是 Parallel Scavenge 收集器的老年代版本,在注重吞吐量或 者处理器资源较为稀缺的场合,都可以优先考虑 Parallel Scavenge 加 Parallel Old 收集器这个组合。
6. CMS 收集器
CMS(Concurrent Mark Sweep) 收集器是—种以获取最短回收停顿时间为目标的收集器,基于标记-清除算法实现,它的运作过程相对于前面几 种收集器来说要更复杂—些, 整个过程分为四个步骤, 包括:1) 初始标记 (CMS initial mark);2) 并发标记 (CMS concurrent mark); 3) 重新标记 (CMS remark);4) 并发清除 (CMS concurrent sweep)。从总体上来 说, CMS收集器的内存回收过程是与用户线程一起并发执行的。 CMS 最 主要的优点:并发收集、低停顿,一些官方公开文档里面也称之为“并发低停顿收集器”(Concurrent Low Pause Collector)。
三个缺点: 1)对处理器资源非常敏感,2)无法处理“浮动垃圾”(FloatingGarbage),3)收集结束时会有大量空间碎片产生。

7. Garbage First 收集器
G1 是一款主要面向服务端应用的垃圾收集器。它可以面向堆内存任何部分来组成回收集 (Collection Set,一般简称 CSet) 进行回收, 衡量标准不再是它属于哪个分代,而是哪块内存中存放的垃圾数量最多,回收收益最大。 G1 的堆内存的把连续的 Java 堆划分为多个大小相等的 独立区域 (Region),只要大小超过了一个 Region 量一半的对象即可判定为大对象。
新生代和老年代不再是固定的, 而是一系列区域 (不需 要连续) 的动态集合。G1 跟踪各个 Region 里面的垃圾堆积的“价值”大小(价值即回收所获得的空间大小以及回收所 需时间的经验值),然后在后台维护—个优先级列表, 每次根据用户设定允 许的收集停顿时间 (使用参数-XX: MaxGCPauseMillis 指定) ,优先处理回收价值收益最大的那些 Region。

优点:1)可以指定最大停顿时间、分 Region 的内存布局、 按收益动态确定回收集; 2)G1 运作期间不会产生内存空间碎片, 垃圾收集完成之后能提供规整的可用内存。这种特性有利于程序长时间运行
缺点:在用户程序运行过程中,G1 为了垃圾收集产生的 内存占用 (Footprint) 和程序运行时的额外执行负载 (Overload) 都要更高。
目前在小内存应用上 CMS 的表现大概率优于 G1,而在大内存应用上 G1 则大多能发挥其优势。
8. 垃圾收集器的选择
三项最重要的指标: 内存占用 (Footprint) 、吞吐量 (Throughput) 和延迟 (Latency),在这三个方面同时具有卓越表现的“完美”收集器是极其困难甚至是不可能的, 一款优秀的收集器通常最多可以同时达成其中的两项。
如何选择适合自己应用的收集器?1)考虑应用程序的主要关注点; 2) 考虑运行应用的基础设施情况,如硬件规格,处理器的数量, 分配内存大小等; 3)考虑使用 JDK 的发行商和版本号。