js css html

CMS G1 ZGC三大垃圾收集器大比拼

2022-10-11  本文已影响0人  王侦

今天这篇文章来介绍一下三大核心的垃圾收集器CMS G1 ZGC,并对它们的特点作简要分析。

1.CMS

首先来看看JDK1.8及之前的核心垃圾收集器CMS,它一般与ParNew搭配使用。

CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用,它是HotSpot虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。

CMS收集器使用 “标记-清除”算法实现的。

1.1 垃圾收集流程

1.2 优点

并发收集、低停顿。

1.3 缺点

2.G1

G1是在JDK7正式引入,JDK9及以后成为默认的垃圾回收器。

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

G1的核心思想就是化整为零。将Java堆划分为多个大小相等的独立区域(Region),JVM目标是不超过2048个Region(JVM源码里TARGET_REGION_NUMBER 定义),实际可以超过该值,但是不推荐。


2.1 垃圾收集过程

2.1.1 YoungGC

YoungGC并不是说现有的Eden区放满了就会马上触发,G1会计算下现在Eden区回收大概要多久时间,如果回收时间远远小于参数 -XX:MaxGCPauseMills 设定的值,那么增加年轻代的region,继续给新对象存放,不会马上做Young GC,直到下一次Eden区放满,G1计算回收时间接近参数 -XX:MaxGCPauseMills 设定的值,那么就会触发Young GC。

2.1.2 MixedGC

老年代的堆占有率达到参数(-XX:InitiatingHeapOccupancyPercent)设定的值则触发,回收所有的Young和部分Old(根据期望的GC停顿时间确定old区垃圾收集的优先顺序)以及大对象区,正常情况G1的垃圾收集是先做MixedGC,主要使用复制算法,需要把各个region中存活的对象拷贝到别的region里去,拷贝过程中如果发现没有足够的空region能够承载拷贝对象就会触发一次Full GC


G1收集器一次GC(主要指Mixed GC)的运作过程大致分为以下几个步骤:

不管是年轻代或是老年代,回收算法主要用的是复制算法,将一个region中的存活对象复制到另一个region中,这种不会像CMS那样回收完因为有很多内存碎片还需要整理一次,G1采用复制算法回收几乎不会有太多内存碎片。(注意:CMS回收阶段是跟用户线程一起并发执行的,G1因为内部实现太复杂暂时没实现并发回收,不过到了ZGC,Shenandoah就实现了并发收集,Shenandoah可以看成是G1的升级版本)。

G1收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的Region(这也就是它的名字Garbage-First的由来),比如一个Region花200ms能回收10M垃圾,另外一个Region花50ms能回收20M垃圾,在回收时间有限情况下,G1当然会优先选择后面这个Region回收。这种使用Region划分内存空间以及有优先级的区域回收方式,保证了G1收集器在有限时间内可以尽可能高的收集效率。

2.1.3 FullGC

MixedGC过程中如果发现没有足够的空region能够承载拷贝对象就会触发一次Full GC。

停止系统程序,然后采用单线程进行标记、清理和压缩整理,好空闲出来一批Region来供下一次MixedGC使用,这个过程是非常耗时的。(Shenandoah优化成多线程收集了)

2.2 G1的优点

2.3 G1的缺点

相较于CMS,G1还不具备全方位压倒性优势,比如在用户程序运行过程中,G1无论是为了垃圾收集产生的内存占用还是垃圾收集时的额外负载都比CMS高,所以G1适合用在高配置服务器上。而低配服务器上CMS大概率优于G1。

另外G1的筛选回收阶段无法做到与用户线性并发。

3.ZGC

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

为了细粒度地控制内存的分配,和G1一样,ZGC将内存划分成小的分区,在ZGC中称为页面(page)。ZGC中没有分代的概念(新生代、老年代)。ZGC支持3种页面,分别为小页面、中页面和大页面。其中小页面指的是2MB的页面空间,中页面指32MB的页面空间,大页面指受操作系统控制的大页。

3.1 ZGC垃圾收集流程

3.2 优势

3.2.1 颜色指针

Colored Pointers,即颜色指针,ZGC的核心设计之一。以前的垃圾回收器的GC信息都保存在对象头中,而ZGC的GC信息保存在指针中。



颜色指针的三大优势:

3.2.2 读屏障

之前的GC都是采用Write Barrier,这次ZGC采用了完全不同的方案读屏障,这个是ZGC一个非常重要的特性。
在标记和移动对象的阶段,每次「从堆里对象的引用类型中读取一个指针」的时候,都需要加上一个Load Barriers。

3.3 缺点

上一篇 下一篇

猜你喜欢

热点阅读