作者:凯文 @开源Favorer
在上一个CHAT中,我们介绍JVM内存的划分、JVM如何确定一个对象是否为垃圾、垃圾回收算法以及著名的STOP THE WORLD问题和三色标记法,这些问题都是面试的高频问题,如果读者对上述相关知识还不是太熟悉,建议先阅读本合集上一个CHAT。
本CHAT我们将聚焦JVM垃圾收集器,具体包括垃圾收集器的评价指标、垃圾回收类型、经典垃圾收集器、新型垃圾收集器。

垃圾收集器评价指标
- 内存占用
内存占用是一个空间指标,指进行垃圾回收时对内存的使用效率,指标值越低越好。
- 吞吐量
吞吐量=代码运行时间(代码运行时间+垃圾回收时间(即stop the world 时长)),是一个效率指标,该指标值越大越好。
- 延迟
延迟是一个时间绝对值指标,指垃圾回收时间的平均时长,该指标值越小越好。
这三个指标构成一个“不可能三角”,即只能就着两个目标值来设计垃圾收集器。
垃圾回收种类
根据发生垃圾回收发生的堆内存位置不同,通常情况下,可以分为minorGC和fullGC。
- minorGC
minorGC发生在青年代(又名初生代),其发生过程如下:1、新建对象都会被创建在Eden区;2、当Eden区的没有连续的空间可供给给新生的对象时,发生一次标记,标记为垃圾的对象会被清理掉,存活的对象则会复制到Survivor区;3、Survivor分为from和to两个等大的区域,当发生一次垃圾标记时,from区也会将区域内垃圾清理掉,然后将存活对象复制到to区域,若存活对象达到一定阈值(即经历的minorGC次数)时,就会将其移动至老年代;4、完成复制后,交换命名区域(即from和to区交换命名)等待下一次标记。对应过程如下图所示:

(minorGC示意图)
- fullGC
fullGC发生在老年代,其发生过程比较简单,当来自Survivor区或大对象(大对象直接进入老年代,多大才算大,取决于JVM的参数设定)在老年代没有连续的可用空间分配时,就会发生fullGC,这是在老年代和青年代都发起一轮标记和垃圾清理工作。需要注意的是,一般情况下,fullGC停顿时间是minorGC的10倍以上(因为fullGC是全面的垃圾回收,其需要回收的对象是若干倍于minorGC)。
有了以上的知识,我们就可以进入垃圾收集器的大盘点了。
经典垃圾收集器
- Serial收集器
如其名,单线程工作模式;适用于青年代和老年代,青年代使用标记复制算法(所有的收集器青年代都是该算法,非常好记),老年代使用标记整理算法。
- ParNew收集器
本质是Serial收集器的多线程版本,定位为青年代垃圾收集器,使用标记复制算法。
- Parallel Scanvenge收集器
多线程垃圾收集器,定位为青年代垃圾收集器,使用标记复制算法。
- Parallel Old收集器
多线程垃圾收集器,定位为老年代垃圾收集器,使用标记整理算法。
- CMS收集器
以低延迟为重要设计目标的垃圾收集器,定位为老年代垃圾收集器,使用标记清除算法。其过程更为复杂,包括初始标记、并行标记、重新标记、并发清除四个步骤,其中,初始标记、重新标记两个环节会触发stop the world。另外,并行标记由于不触发stop the world,所以必然需要预留一部分内存给到用户,所以即便没有100%分配完可用的连续空间,仍可能引发fullGC(这一点仅供了解,比较冷门)。
- G1收集器
以低延迟和高吞吐量作为设计目标。该垃圾收集器非常特殊,不再以分代作为内存划分模型,而是将堆划分成多个大小相等的独立区域,每一个区域都可以根据需要,作为Eden、Survivor和老年代空间,另外存在一个Humongous的区域,专门用来存储大对象,所以既可以说兼具青年代和老年代垃圾收集器,也可以说无所谓青年代和老年代垃圾回收器。标记整理环节包括:初始标记、并行标记、重新标记、筛选回收四个步骤。相较于CMS,内存额外开销较大,但当堆内存到6-8G以上规模时,G1性能优势就比较明显了,属于以空间换性能的做法,这也是现代垃圾收集器追求的目标(即低延迟、高吞吐两个指标)。
新型垃圾收集器
层出不穷的垃圾收集器总是在追求卓越的路上永不停息,下面简单介绍两款新型收集器,较为前沿,仅作了解,欲详细了解其内容,请自行查阅相关资料。
- Shenandoah收集器
一款专注于提升低延迟性能的收集器,其发布于JDK11,是JDK12的默认垃圾收集器,一个突出的亮点是其在垃圾收集过程中引入压缩技术,一定程度上使得延迟时间不再与堆大小成正比。
- ZGC收集器
同样是一款发布于JDK11专注于提升低延迟性能的收集器,其主要两点是引入了着色指针和读屏障两个新技术,可以保证支持TB级的堆内存大小,最大GC停顿时间不超10ms。
以上就是本CHAT的内容,下一期凯哥将和你一起探寻JVM垃圾回收方面的调优工作,欢迎继续关注。