新一代垃圾回收器 ZGC 设计与实现 阅读笔记 第1章 垃圾回收器概述

垃圾回收算法:

  引用计数法:

     给对象分配一段额外的空间,用于维护一个计数器,对象增加了一个新的引用,则增加计数器的值。一个引用关系失效,则减少计数器的值。但是需要解决循环依赖的问题

可达性分析法: 

    通过根集合作为起始点,根据引用关系开始搜索。JVM中常见的根有线程栈帧,符号表,字符串表,对象监视器,元数据对象。

  并发执行垃圾回收器: CMS,G1,ZGC,Shenandoah

ZGC 解决 G1的不足 

    G1 :YGC回收所有新生代分区,混合回收时回收所有的新生代分区和部分老年代分区;使用RSet管理对象引用关系

    1. 停顿时间过长 : G1停顿 几十到几百毫秒

     2.内存利用率不高 : 引用关系处理需要消耗额外的内存,一般占整个内存的1%到20%

      3.支持内存有效,高于100GB,内存过大导致停顿时间增长

ZGC 设计目标

    1. 支持4TB内存

    2.停顿时间控制在10ms之内

    3.对程序吞吐量影响小于15%

ZGC把一切能并发处理的工作都并发执行,G1的停顿时间主要来自 垃圾回收阶段的复制算法,在复制算法中,需要把对象转移到新的空间中,并且更新其他对象到这个对象的引用。ZGC就是把对象的转移也并发执行,从而满足停顿时间在10ms以下

GC 复制算法是利用From 空间进行分配的。当From 空间被完全占满时,GC 会将活动
对象全部复制到To 空间。当复制完成后,该算法会把From 空间和To 空间互换,GC 也就结
束了。From 空间和To 空间大小必须一致。这是为了保证能把From 空间中的所有活动对象
都收纳到To 空间里。
 

ZGC中 ,垃圾回收就是全量回收,每发生一次垃圾回收就是一次FGC,每次回收停顿时间在10ms以下,所以FGC时间就是可控的;   把标记,转移,引用处理,符号表,字符串表,弱引用处理,类卸载都变成了并发执行。

ZGC 特点 :

    1.不分代垃圾回收 :垃圾回收对全量内存进行标记,回收时对部分内存回收,优先回收垃圾多的页面;仅支持64位,不支持32位平台

    2.不支持使用压缩指针

    3.内存分区管理,且支持不同的分区粒度,在ZGC中分区称为页面,分为小页面,中页面,大页面

    4.颜色指针 : 不同标记位指示的不同虚拟空间通过mmap 映射在同一物理地址,颜色指针能够快速实现并发标记,转移和重定位

    5.读屏障 : 实现了并发标记,并发转移的处理

    6.支持NUMA:尽量把对象分配在访问速度比较快的地方。

ZGC 缺点:

    1.不支持分代内存管理

     2.C2的支持还不够完善

     3.不支持Graal,HDSB等功能

     4.不支持类回收

     5.稳定性需要提高

ZGC 除了并发转移,还对整个垃圾回收进入STW的过程做了改进,把原来串行执行的部分也并发执行。

1.2.6 Shenandoah  

   JDK 12 引入,不仅进行并行的垃圾标记,压缩堆空间也是并发进行的。原来的对象头上增加额外的指针,可以实现读屏障,写屏障和比较屏障,目前还在测试阶段

  

发布了331 篇原创文章 · 获赞 1 · 访问量 3480

猜你喜欢

转载自blog.csdn.net/kuaipao19950507/article/details/104011426