写在前面

本文隶属于专栏《100个问题搞定Java虚拟机》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和文献引用请见100个问题搞定Java虚拟机

解答

新生代垃圾收集器

针对新生代的垃圾收集器共有三个:Serial,Parallel Scavenge 和 Parallel New。
这三个采用的都是标记 - 复制算法。
其中,Serial 是一个单线程的,Parallel New 可以看成 Serial 的多线程版本。
Parallel Scavenge 和 Parallel New 类似,但更加注重吞吐率。
此外,Parallel Scavenge 不能与 CMS 一起使用。

老年代垃圾收集器

针对老年代的垃圾收集器也有三个:Serial Old 和 Parallel Old,以及 CMS。
Serial Old 和 Parallel Old 都是标记 - 整理算法。
同样,前者是单线程的,而后者可以看成前者的多线程版本。
CMS 采用的是标记 - 清除算法,并且是并发的。除了少数几个操作需要 Stop-the-world 之外,它可以在应用程序运行过程中进行垃圾回收。
在并发收集失败的情况下,Java 虚拟机会使用其他两个压缩型垃圾收集器进行一次垃圾回收。

G1

由于 G1 的出现,CMS 在 Java 9 中已被废弃。
G1(Garbage First)是一个横跨新生代和老年代的垃圾收集器。
实际上,它已经打乱了新生代和老年代的堆结构,直接将堆分成极其多个区域。每个区域都可以充当 Eden 区、Survivor 区或者老年代中的一个。
它采用的是标记 - 压缩算法,而且和 CMS 一样都能够在应用程序运行过程中并发地进行垃圾回收。
G1 能够针对每个细分的区域来进行垃圾回收。在选择进行垃圾回收的区域时,它会优先回收死亡对象较多的区域。这也是 G1 名字的由来。

关于 G1 GC 更多内容请见我的另一篇博客——G1 GC是什么?

ZGC

ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的实验性质的垃圾收集器,它的设计目标包括:

  1. 停顿时间不超过10ms;
  2. 停顿时间不会随着堆的大小,或者活跃对象的大小而增加;
  3. 支持8MB~4TB级别的堆(未来支持16TB)。
    ZGC收集器和 G1 类似,也是基于Region内存布局,暂时不设分代,使用读屏障,着色指针和内存多重映射等技术来实现并发的标记整理算法。
上一篇 下一篇