JVM垃圾收集器介绍

深入学习Java基础知识
2021-05-17 14:29 · 阅读时长5分钟
小课

JVM目前有五种的垃圾收集器,分别是Serial垃圾收集器、Parallel垃圾收集器,Mostly Concurrent垃圾收集器和Z垃圾收集器。本文将一一介绍这几种垃圾收集器,如果想了解垃圾收集机制内部原理可以参考JVM垃圾收集机制

Serial垃圾收集器

Serial垃圾收集器是分代垃圾收集器,它使用单个线程完成垃圾收集工作,当它在工作时,其它所有的线程都会暂停等待垃圾收集工作完成,这种现象就是经常被提到的 Stop the world event,因为它是单线程的,没有多线程之前通信的开销,所以工作效率相对较高,但是同时也没有了多线程的优势,使得它不适合用在多核处理器的机器上。

JVM垃圾收集器介绍

Serial垃圾收集器在一些特定的环境下会被使用,如果要手动设置使用Serial垃圾收集器,可以通过-XX:+UseSerialGC来启用它。

官方文档:5 Available Collectors

注释
Parallel垃圾收集器

它优化了垃圾收集器的吞吐量,又被称为Throughput collector(吞吐量收集器),它也是一个分代垃圾收集器,它和Serial垃圾收集器主要的区别就是它是使用多线程去完成垃圾收集工作,而Serial垃圾收集器是使用单线程,如果在多核处理器上,Parallel垃圾收集器利用多线程优势加速完成垃圾收集过程,所以它比较适合用在业务内存使用量较大的多核处理器的机器上。它在进行垃圾收集工作时,同样也会暂停其它所有线程(Stop the world event)直到垃圾收集工作完成。

JVM垃圾收集器介绍

如果想要手动设置使用Parallel垃圾收集器,可以通过-XX:+UseParallelGC 来启用它,更多配置参考右边的拓展链接👉。

Parallel垃圾收集器和Serial垃圾收集器在新生代和老年代进行垃圾收集时都是会发生Stop the world event,而且持续整个GC过程。

JVM垃圾收集器介绍

拓展链接:The Parallel Collector

注释
Mostly Concurrent垃圾收集器

不完全并发垃圾收集器,目前有两个常用的,一个是Concurrent Mark Sweep (CMS) 垃圾收集器和Garbage-First (G1) 垃圾收集器,相对于前面两种垃圾收集器而言,可以减少其它工作线程暂停的时间,但是会消耗较多资源。

CMS垃圾收集器是分代垃圾收集器,它使用多线程进行垃圾收集工作,和Parallel垃圾收集器不同的是,在垃圾收集过程中,CMS垃圾收集器不会总是暂停其它所有线程,大部分时候它的GC线程会和其它工作线程并发执行,优化了垃圾收集的暂停时间,它的一次垃圾收集过程包括以下几个阶段。

  • Inital Mark初始标记,这个阶段会标记一些从GC roots或者堆中其他地方可以直接访问的对象,该阶段会暂停其它所有线程。
  • Concurrent Mark并发标记,这个阶段会使用多个GC线程继续标记对象,不会暂停其它工作线程,但是会造成一定的性能损耗。
  • Remark再标记,因为在并发标记阶段,并未暂停其它线程,所以并发标记阶段仍然会产生新的可回收对象,这个阶段就是找出这些遗漏的可回收对象,这个阶段会暂停其它所有线程。
  • Concurrent Sweep并发清除,这个阶段主要是做清除工作,也不会暂停其它工作线程。

其中会造成两次 Stop the world event,一次是在初始标记时,第二次是在再标记时,它的垃圾收集步骤执行顺序图如下。

JVM垃圾收集器介绍

如果要手动设置使用CMS垃圾收集器,可以通过-XX:+UseParNewGC启用,注:CMS垃圾收集器在Java 9中已经标记废弃deprecated,在Java 14中已经移除。

CMS垃圾收集器在新生代进行垃圾收集时是会发生Stop the world event,而且持续整个GC过程,而在老年代进行垃圾收集时和上面提到过程一致,只有在初始标记时和再标记时才会Stop the world event。

JVM垃圾收集器介绍

G1垃圾收集器在提高吞吐量和降低垃圾收集的暂停时间方面都做了优化,可以通过参数调节吞吐量和暂停时间的能力以适应不同业务场景,它也是一个分代垃圾收集器,与其它垃圾收集器不同的是,G1是将内存分成了很多固定且大小相等的Region,这些Region被标记成E、S、O、H,分别表示Eden、Survivor、Old、Humongous,其中Humongous表示大对象(内存大于单个Region的50%),不同的分代区在物理内存上是不连续的。

JVM垃圾收集器介绍

虽然内存在物理上划分方式不同,但是垃圾收集的机制还是和以前的垃圾收集器类似,当Eden区域不够时会触发新生代的垃圾收集,Eden区域的对象会被复制到Survivor区域,Survivor区域的对象年龄达到阈值时,会晋升到Old区域。G1在老年代的垃圾收集过程包括以下几个阶段。

  • Initial Mark初始标记,发生在新生代垃圾收集的STW时间段,标记从GC roots可以直接访问的对象。
  • Root Region Scanning根区域扫描,标记出所有Survivor区域对老年代有引用的对象,这个阶段不会暂停其它工作线程。
  • Concurrent Marking并发标记,标记出堆中所有的存活对象,这个阶段不会暂停其它工作线程。
  • Remark再标记,标记在并发标记阶段发生变化或遗留的对象,这个阶段会暂停其它所有线程。
  • Cleanup清除,这个阶段分为两步,一是统计存活的对象和空闲的Region,这一步会暂停其它所有工作线程,第二步是并发清除对象和回收空闲的Region。
  • Copying复制,整理存活的对象,在不同的Region之间复制,这个会暂停其它所有线程。

G1垃圾收集器在新生代进行垃圾收集时是会发生Stop the world event,而且持续整个GC过程。

JVM垃圾收集器介绍
Z 垃圾收集器

Z Garbage Collector(ZGC)是一个低延迟可扩展的垃圾收集器,它通过Colored Pointers(着色指针)和Load Barrier(读屏障)机制实现了并发转移,大大减少了垃圾收集导致的暂停时间。

垃圾收集器GCG1垃圾收集器