CMS G1 ZGC三大垃圾网络器大比拼

藏宝库编辑 2024-10-7 08:37:35 111 0 来自 中国
本日这篇文章来先容一下三大核心的垃圾网络器CMS G1 ZGC,并对它们的特点作扼要分析。
1.CMS

起首来看看JDK1.8及之前的核心垃圾网络器CMS,它一样寻常与ParNew搭配利用。
CMS(Concurrent Mark Sweep)网络器是一种以获取最短接纳停顿时间为目的的网络器。它非常符合在注意用户体验的应用上利用,它是HotSpot假造机第一款真正意义上的并发网络器,它第一次实现了让垃圾网络线程与用户线程(根本上)同时工作。
CMS网络器利用 “标记-扫除”算法实现的。
1.1 垃圾网络流程



  • 初始标记: 停息全部的其他线程(STW),并记载下gc roots直接能引用的对象,速率很快。
  • 并发标记: 并发标记阶段就是从GC Roots的直接关联对象开始遍历整个对象图的过程, 这个过程耗时较长但是不须要停顿用户线程, 可以与垃圾网络线程一起并发运行。由于用户步伐继承运行,大概会有导致已经标记过的对象状态发生改变。
  • 重新标记: 重新标记阶段就是为了修正并发标记期间由于用户步伐继承运行而导致标记产生变动的那一部分对象的标记记载,这个阶段的停顿时间一样寻常会比初始标记阶段的时间稍长,远远比并发标记阶段时间短。紧张用到三色标记里的增量更新算法(见下面详解)做重新标记。
  • 并发清算: 开启用户线程,同时GC线程开始对未标记的地域做排除。这个阶段假如有新增对象会被标记为玄色不做任那边理处罚(见下面三色标记算法详解)。
  • 并发重置:重置本次GC过程中的标记数据。
1.2 长处

并发网络、低停顿。
1.3 缺点


  • 对CPU资源敏感(会和服务抢资源);
  • 无法处理处罚浮动垃圾(在并发标记和并发清算阶段又产生垃圾,这种浮动垃圾只能比及下一次gc再清算了);
  • 它利用的接纳算法-“标记-扫除”算法会导致网络竣事时会有大量空间碎片产生,当然通过参数-XX:+UseCMSCompactAtFullCollection可以让jvm在实验完标记扫除后再做整理
  • 实验过程中的不确定性,会存在上一次垃圾接纳还没实验完,然后垃圾接纳又被触发的情况,特殊是在并发标记和并发清算阶段会出现,一边接纳,体系一边运行,大概没接纳完就再次触发full gc,也就是"concurrent mode failure",此时会进入stop the world,用serial old垃圾网络器来接纳
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
3.png
G1网络器一次GC(紧张指Mixed GC)的运作过程大抵分为以下几个步调:

  • 初始标记(initial mark,STW):停息全部的其他线程,并记载下gc roots直接能引用的对象,速率很快 ;
  • 并发标记(Concurrent Marking):同CMS的并发标记
  • 终极标记(Remark,STW):同CMS的重新标记
  • 筛选接纳(Cleanup,STW):筛选接纳阶段起首对各个Region的接纳代价和资本举行排序,根据用户所盼望的GC停顿STW时间(可以用JVM参数 -XX:MaxGCPauseMillis指定)来订定接纳操持。
不管是年轻代或是老年代,接纳算法紧张用的是复制算法,将一个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的长处


  • 并行与并发:G1能充分利用CPU、多核环境下的硬件上风,利用多个CPU(CPU大概CPU核心)来紧缩Stop-The-World停顿时间。部分其他网络器原本须要停顿Java线程来实验GC动作,G1网络器仍然可以通过并发的方式让java步伐继承实验。
  • 分代网络:固然G1可以不须要其他网络器共同就能独立管理整个GC堆,但是还是保存了分代的概念。
  • 空间整合:与CMS的“标记--清算”算法差别,G1从团体来看是基于“标记整理”算法实现的网络器;从局部上来看是基于“复制”算法实现的。
  • 可推测的停顿:这是G1相对于CMS的另一个大上风,低落停顿时间是G1 和 CMS 共同的关注点,但G1 除了寻求低停顿外,还能创建可推测的停顿时间模子,能让利用者明白指定在一个长度为M毫秒的时间片断(通过参数"-XX:MaxGCPauseMillis"指定)内完成垃圾网络。
2.3 G1的缺点

相较于CMS,G1还不具备全方位压倒性上风,比如在用户步伐运行过程中,G1无论是为了垃圾网络产生的内存占用还是垃圾网络时的额外负载都比CMS高,以是G1适当用在高设置服务器上。而低配服务器上CMS大概率优于G1。
别的G1的筛选接纳阶段无法做到与用户线性并发。
3.ZGC

ZGC(The Z Garbage Collector)是JDK 11中推出的一款寻求极致低耽误的垃圾网络器,它曾经计划目的包罗:

  • 停顿时间不凌驾10ms(JDK16已经到达不凌驾1ms);
  • 停顿时间不会随着堆的巨细,大概生动对象的巨细而增长;
  • 支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。
为了细粒度地控制内存的分配,和G1一样,ZGC将内存分别成小的分区,在ZGC中称为页面(page)。ZGC中没有分代的概念(新生代、老年代)。ZGC支持3种页面,分别为小页面、中页面和大页面。其中小页面指的是2MB的页面空间,中页面指32MB的页面空间,大页面指受操纵体系控制的大页。
3.1 ZGC垃圾网络流程



  • 1.初始标记(Mark Start)
    这个阶段须要停息(STW),初始标记只须要扫描全部GC Roots,其处理处罚时间和GC Roots的数目成正比,停顿时间不会随着堆的巨细大概生动对象的巨细而增长。
  • 2.并发标记(Concurrent Mark)
    这个阶段不须要停息(无STW),扫描剩余的全部对象,这个处理处罚时间比力长,以是走并发,业务线程与GC线程同时运行。但是这个阶段会产生漏标题目。
  • 3.终极标记(Mark End)
    这个阶段须要停息(STW),紧张处理处罚漏标对象,通过SATB算法办理(G1中的办理漏标的方案)。
  • 4.并发重分配准备(Concurrent Prepare For Relocate, 分析最有代价GC分页(无STW)  ),这个阶段须要根据特定的查询条件统计得出本次网络过程要清算哪些Region,将这些Region构成重分配集(Relocation Set)。ZGC每次接纳都会扫描全部的Region,用范围更大的扫描资本变更省去G1中影象集的维护资本。
  • 5.初始转移(重分配Relocate Start)(转移初始标记的存活对象同时做对象重定位(STW) )
  • 6.并发转移(重分配Concurrent Relocate)(对转移并发标记的存活对象做转移(无STW)),重分配是ZGC实验过程中的核心阶段,这个过程要把重分配集中的存活对象复制到新的Region上,并为重分配集中的每个Region维护一个转发表(Forward Table),记载从旧对象到新对象的转向关系。
  • 7.并发重映射(Concurrent Remap):重映射所做的就是修正整个堆中指向重分配集中旧对象的全部引用,但是ZGC中对象引用存在“自愈”功能,以是这个重映射操纵并不是很迫切。ZGC很奥妙地把并发重映射阶段要做的工作,归并到了下一次垃圾网络循环中的并发标记阶段里去完成,反正它们都是要遍历全部对象的,如许归并就节流了一次遍历对象图的开销。一旦全部指针都被修正之后, 原来记载新旧对象关系的转发表就可以开释掉了。
3.2 上风

3.2.1 颜色指针

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

6.png
颜色指针的三大上风:

  • 一旦某个Region的存活对象被移走之后,这个Region立刻就可以大概被开释和重用掉,而不必等候整个堆中全部指向该Region的引用都被修正后才气清算,这使得理论上只要另有一个空闲Region,ZGC就能完成网络。
  • 颜色指针可以大幅减少在垃圾网络过程中内存屏蔽的利用数目,ZGC只利用了读屏蔽。
  • 颜色指针具备强盛的扩展性,它可以作为一种可扩展的存储布局用来记载更多与对象标记、重定位过程干系的数据,以便日后进一步进步性能。
3.2.2 读屏蔽

之前的GC都是接纳Write Barrier,这次ZGC接纳了完全差别的方案读屏蔽,这个是ZGC一个非常紧张的特性。
在标记和移动对象的阶段,每次「从堆里对象的引用范例中读取一个指针」的时间,都须要加上一个Load Barriers。

  • 涉及对象:并发转移但还没做对象重定位的对象(着色指针利用M0和M1可以区分)
  • 触发机会:在两次GC之间业务线程访问如许的对象
  • 触发操纵:对象重定位+删除转发表记载(两个一起做原子操纵)
  • 读屏蔽是JVM向应用代码插入一小段代码的技能。当应用线程从堆中读取对象引用时,就会实验这段代码。须要注意的是,仅“从堆中读取对象引用”才会触发这段代码
3.3 缺点


  • RSS 内存非常征象
    由前面 ZGC 原理可知,ZGC 接纳多映射 multi-mapping 的方法实现了三份假造内存指向同一份物理内存。而 Linux 统计进程 RSS 内存占用的算法是比力脆弱的,这种多映射的方式并没有思量完备,因此根据当前 Linux 接纳大页和小页时,其统计的开启 ZGC 的 Java 进程的内存体现是差别的。在内核利用小页的 Linux 版本上,这种三映射的同一块物理内存会被 linux 的 RSS 占用算法统计 3 次,因此通常可以看到利用 ZGC 的 Java 进程的 RSS 内存膨胀了三倍左右,但是实际占用只有统计数据的三分之一,会对运维大概其他业务造成肯定的困扰。而在内核利用大页的 Linux 版本上,这部分三映射的物理内存则会统计到 hugetlbfs inode 上,而不是当前 Java 进程上。
  • ZGC没有分代概念,每次都须要举行全堆扫描,导致一些“朝生夕死”的对象没能实时的被接纳。
    ZGC最大的题目是浮动垃圾。ZGC的停顿时间是在10ms以下,但是ZGC的实验时间还是远宏大于这个时间的。假如ZGC全过程须要实验10分钟,在这个期间由于对象分配速率很高,将创建大量的新对象,这些对象很难进入当次GC,以是只能在下次GC的时间举行接纳,这些只能比及下次GC才气接纳的对象就是浮动垃圾。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-2-6 06:01, Processed in 0.189016 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表