Java垃圾收集器详解(7种Java垃圾收集器)

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

Java垃圾收集器经常在Java面试被问到,比如:Java垃圾收集器有哪些?下面我就来详解7种Java垃圾收集器@mikechen

Serial串行收集器

Serial是一个新生代收集器,使用的是标记复制算法,Serial收集器是最基础也是历史最悠久的收集器。

如下图所示:

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

Serial串行收集器的主要特点是单线程收集,即只使用一个线程来完成垃圾收集工作。

Serial串行收集器是一个年轻代收集器,它使用标记复制算法进行垃圾回收。

由于Serial收集器是单线程的,因此它的效率较低,无法满足大型应用程序的需求,所以出现了Parallel并行收集器。

 

Parallel并行收集器

Parallel并行收集器是在Serial收集器的基础上发展而来,其主要特点是使用多个线程同时进行垃圾回收,从而提高垃圾回收的效率。

如下图所示:

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

ParNew收集器就是Serial收集器的多线程版本, 两者的区别就是Serial使用单线程进行垃圾回收,ParNew使用多条线程进行垃圾回收。

Parallel收集器同样是一个年轻代收集器,它使用标记复制算法进行垃圾回收。

Parallel收集器的并行特性使其在处理大型应用程序时表现出色,尤其是在多核CPU系统中的效果更加明显。

 

CMS收集器

CMS收集器,全称是Concurrent Mark Sweep,CMS收集器主要用于收集老年代的垃圾。

相比于Serial和Parallel收集器,CMS收集器的主要特点是采用并发收集的方式,即在应用程序运行的同时进行垃圾回收,以避免长时间的垃圾收集暂停时间。

如下图所示:

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

CMS收集器是一种以获取最短回收停顿时间为目标的收集器,采用的是标记清除算法

CMS收集器整个过程分为4个步骤:

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

1.初始标记

单线程执行,标记出GC Roots能直接关联到的对象,速度较快。

 

2.并发标记

并发执行,用户线程正常运行,垃圾收集线程进行并发标记。

 

3.重新标记

由于并发标记阶段用户线程仍在执行,所以可能会产生垃圾,重新标记阶段就是将并发标记阶段发生变动了的对象标记进行修正。

 

4.并发清除

并发执行,该阶段直接清楚之前标记的垃圾,用户线程可继续执行。

 

G1收集器

G1,全称是Garbage First,G1垃圾收集器是JVM垃圾收集器最前沿的成果之一。

G1垃圾收集器采用的是分代收集的思想,它将整个Java堆内存划分为多个大小相等的区域(Region),每个区域可以是年轻代,也可以是老年代。

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

同优秀的CMS垃圾回收器一样,G1也是关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集,官方也推荐使用G1来代替选择CMS。

G1收集器的阶段分以下几个步骤:

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

1.初始标记

G1执行的第一阶段:这个阶段是STW(Stop the World )的,所有应用线程会被暂停,标记出从GC Root开始直接可达的对象。

2.并发标记
G1执行的第二阶段:从GC Roots开始对堆中对象进行可达性分析,找出存活对象。

3.最终标记

标记那些在并发标记阶段发生变化的对象,将被回收。

4.筛选回收

首先对各个Regin的回收价值和成本进行排序,根据用户所期待的GC停顿时间指定回收计划,回收一部分Region。

G1主要用于收集大堆内存的垃圾,相比于CMS收集器,G1收集器更加注重整理内存碎片,从而提高应用程序的性能和稳定性。

 

ZGC垃圾收集器

ZGC也称为The Z Garbage Collector,ZGC垃圾收集器是JDK 11中推出的一款追求极致低延迟的性质的JVM垃圾收集器

Java垃圾收集器详解(7种Java垃圾收集器)-mikechen

与CMS中的ParNew和G1类似,ZGC也采用标记复制算法,不过ZGC对该算法做了重大改进。

ZGC收集器采用了读屏障技术,这意味着在进行垃圾收集时,ZGC可以非常快速地扫描整个Java堆内存,同时几乎不会产生停顿。

另外,ZGC还采用了可并行的线程技术,这使得ZGC能够充分利用多核CPU,并在多核CPU环境下具有更好的垃圾回收性能。

 

Epsilon垃圾收集器

Epsilon GC,也称为 Java 的无操作垃圾收集器,它的主要特点在于不进行任何垃圾回收操作,即完全不处理垃圾对象。

Epsilon GC 不只是阻止 Java 垃圾收集的发生,它是完全消除了 GC。

Epsilon GC 是随 JDK 11 发布的一项实验性功能,要在启用了 Epsilon GC 的 JVM 上启动应用程序或微服务,请包括以下 JVM 选项:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

Epsilon垃圾收集器适用于那些不需要垃圾收集的特殊应用场景,比如一些测试和基准测试应用程序,或者是需要尽可能地减少垃圾回收带来的性能影响的场景。

 

Shenandoah垃圾收集器

Shenandoah垃圾收集器于JDK 12中首次引入,主要针对需要大内存和低延迟的应用场景。

Shenandoah垃圾收集器采用了类似于CMS垃圾收集器的分代收集策略,将整个Java堆内存分为多个大小相等的区域。

在进行垃圾回收时,Shenandoah会采用全局并发标记-清除算法和全局并发整理算法,将所有的垃圾对象标记并清除,并且将存活的对象移动到其他区域中。

Shenandoah垃圾收集器的主要优点在于它可以在很短的停顿时间内完成垃圾回收操作,并且可以处理非常大的堆内存。

这使得它非常适合于需要大内存和低延迟的应用场景,比如金融、电子商务等领域。

以上就是Java垃圾收集器详解,更多Java虚拟机内容请查看:JVM(Java虚拟机)从0到1全部合集

作者简介

陈睿|mikechen,10年+大厂架构经验,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法