JVM 垃圾收集器

  1. Serial 收集器
  2. ParNew 收集器
  3. Parallel Scavenge 收集器
  4. CMS 收集器
  5. G1 收集器


Serial 收集器

Serial 收集器称为串行收集器,是历史最久远的垃圾收集器,它是一个单线程收集器,并不是只使用一个线程进行垃圾收集,最主要的是它在进行垃圾收集时必须暂停其他所有工作线程直到收集结束

新生代采用标记-复制算法,老年代采用标记-整理算法。



ParNew 收集器

ParNew 收集器其实就是多线程版的 Serial 收集器,使用多线程进行垃圾收集。

新生代采用标记-复制算法,老年代采用标记-整理算法。



Parallel Scavenge 收集器

Parallel Scavenge 收集器(JDK1.8 默认收集器)也是使用标记-复制算法的多线程收集器,相比于 ParNew 收集器,Parallel Scavenge 收集器更注重吞吐量,吞吐量就是 CPU 中用于运行用户代码的时间与 CPU 总消耗时间的比值。

-XX:+UseParallelGC
使用 Parallel 收集器 + 老年代串行
-XX:+UseParallelOldGC
使用 Parallel 收集器 + 老年代并行

新生代采用标记-复制算法,老年代采用标记-整理算法。

JDK1.8 默认使用的是 Parallel Scavenge + Parallel Old,如果指定了-XX:+UseParallelGC 参数,则默认指定了-XX:+UseParallelOldGC,可以使用-XX:-UseParallelOldGC 来禁用该功能



CMS 收集器

CMS 收集器是一种以获得最短回收停顿时间为目标的收集器,主要优点:并发收集低停顿

CMS 收集器采用了标记-清除算法,它的运作过程分为 4 步:

  1. 初始标记
  2. 并发标记
  3. 重新标记
  4. 并发清除

缺点:产生空间碎片、无法处理浮动垃圾、对 CPU 资源敏感。

G1 收集器

G1 收集器是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征。

特点:

  1. 并行与并发
  2. 分代收集
  3. 空间整合
  4. 可预测的停顿

G1 收集器的运作大致分为以下几个步骤:

  1. 初始标记
  2. 并发标记
  3. 最终标记
  4. 筛选回收

G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(