如果说垃圾收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体
实现。下图展示了 7 种作用于不同分代的收集器,其中用于
回收
新生代
的收集器
包括
Serial
、
PraNew
、
Parallel Scavenge
,回收
老年代
的收集器包括
Serial
Old
、
Parallel Old
、
CMS
,还有用于回收整个 Java 堆的
G1 收集器
。不同收集器
之间的连线表示它们可以搭配使用。

•
Serial 收集器(复制算法): 新生代单线程收集器,标记和清理都是单线
程,优点是简单高效;
•
ParNew 收集器 (复制算法): 新生代收并行集器,实际上是 Serial 收集器
的多线程版本,在多核 CPU 环境下有着比 Serial 更好的表现;
•
Parallel Scavenge 收集器 (复制算法): 新生代并行收集器,追求高吞吐
量,高效利用 CPU。吞吐量 = 用户线程时间/(用户线程时间+GC 线程时
间),高吞吐量可以高效率的利用 CPU 时间,尽快完成程序的运算任务,
适合后台应用等对交互相应要求不高的场景;
•
Serial Old 收集器 (标记-整理算法): 老年代单线程收集器,Serial 收
集器的老年代版本;
•
Parallel Old 收集器 (标记-整理算法): 老年代并行收集器,吞吐量优
先,Parallel Scavenge 收集器的老年代版本;
•
CMS(Concurrent Mark Sweep)收集器(标记-清除算法): 老年代并行收
集器,以获取最短回收停顿时间为目标的收集器,具有高并发、低停顿的
特点,追求最短 GC 回收停顿时间。
•
G1(Garbage First)收集器 (标记-整理算法): Java 堆并行收集器,G1
收集器是 JDK1.7 提供的一个新收集器,G1 收集器基于“标记-整理”算法
实现,也就是说不会产生内存碎片。此外,G1 收集器不同于之前的收集器
的一个重要特点是:G1 回收的范围是整个 Java 堆(包括新生代,老年
代),而前六种收集器回收的范围仅限于新生代或老年代。