Contents
  1. 1. 新生代收集器
    1. 1.1. Serial
    2. 1.2. ParNew
    3. 1.3. Parallel Scavenger
  2. 2. 年老代收集器
    1. 2.1. Serial Old
    2. 2.2. Parallel Old
    3. 2.3. CMS(Current Mark Sweep)
      1. 2.3.1. CMS的运作阶段
    4. 2.4. G1(Garbage First)
  3. 3. 各个收集器的可用组合

简单列举了JVM中使用的集中垃圾收集器

新生代收集器

Serial

Serial收集器的机制被称为“Stop the word”。它属于单线程收集器,进行垃圾收集GC的时候会暂停所有的用户线程,采用复制算法进行GC。
这个收集器适用于Client端,因为它对于小内存的收集来说尤为高效,停顿时间也比较短。

ParNew

ParNew收集器同样是使用“Stop the word”机制。但是它是多线程的。如果是运行在多cpu的服务器上的时候,首选这种收集器。

Parallel Scavenger

这是一个吞吐量优先的垃圾收集器,采用多线程机制。

年老代收集器

Serial Old

和Serial相对应,是年老代收集器,使用单线程的和标记-整理算法进行垃圾回收。

Parallel Old

是Parallel Scavenge收集器的年老代版本。使用多线程和标记-整理算法,主要是服务端模式下和Parallel Scavenge收集器组合使用。

CMS(Current Mark Sweep)

CMS是对年老带的进行对象回收,这是一个额外的回收管理机制,基于标记-清除算法实现。它的特点是JVM的停顿时间较短(普通的年老代回收机制就有较长时间的JVM响应停顿),因此CMS主要可以应用于对响应时间有较高要求的服务器上。由于收集完成后会产生碎片,所以要开启 -XXUseCMSCompactAtFullCollection开关参数,表示在Full GC之后,要进行一次碎片整理。开启CMS需要使用额外的参数启用它 :在启动JVM参数加上-XX:+UseConcMarkSweepGC

CMS的运作阶段

  • 初始标记 :在这个阶段,需要虚拟机停顿正在执行的任务,Stop The Word。这个过程从垃圾回收的”根对象”开始,只扫描到能够和”根对象”直接关联的对象,并作标记。所以这个过程虽然暂停了整个JVM,但是很快就完成了。
  • 并发标记 :这个阶段紧随初始标记阶段,在初始标记的基础上继续向下追溯标记。并发标记阶段,应用程序的线程和并发标记的线程并发执行,所以用户不会感受到停顿。
  • 并发预清理 :并发预清理阶段仍然是并发的。在这个阶段,虚拟机查找在执行并发标记阶段新进入老年代的对象(可能会有一些对象从新生代晋升到老年代, 或者有一些对象被分配到老年代)。通过重新扫描,减少下一个阶段”重新标记”的工作,因为下一个阶段会Stop The World。
  • 重新标记 :这个阶段会暂停虚拟机,收集器线程扫描在CMS堆中剩余的对象。扫描从”根对象”开始向下追溯,并处理对象关联。
  • 并发清理 :清理垃圾对象,这个阶段收集器线程和应用程序线程并发执行。
  • 并发重置 :这个阶段,重置CMS收集器的数据结构,等待下一次垃圾回收。

G1(Garbage First)

G1将整个JAVA堆(包括新生代、老年代)划分为多个固定大小的独立区域,并跟踪垃圾堆积程度,在后台维护一个优先列表,每次根据允许的收集时间,有限回收垃圾最多的区域。 它是基于标记-整理算法实现的,并且具有非常准确的控制停顿。

各个收集器的可用组合

图例表示了各个收集器组合可能性,如果两个收集器之间存在连线,表明他们可以一起组合使用。

Contents
  1. 1. 新生代收集器
    1. 1.1. Serial
    2. 1.2. ParNew
    3. 1.3. Parallel Scavenger
  2. 2. 年老代收集器
    1. 2.1. Serial Old
    2. 2.2. Parallel Old
    3. 2.3. CMS(Current Mark Sweep)
      1. 2.3.1. CMS的运作阶段
    4. 2.4. G1(Garbage First)
  3. 3. 各个收集器的可用组合