0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZGC的垃圾回收流程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-11 15:37 次阅读

Java长期支持版本Java11发布时推出了ZGC, 之后的Java12 -16均有ZGC的一些更新。然而Java17的新特性已经敲定,确定没有关于ZGC的相关更新,也从另一方面说明了至Java17 ZGC已经比较稳定,可以作为比较稳定的GC垃圾回收器。相信未来ZGC必定会成为主流的Java垃圾回收期,那么盘一盘ZGC就是必然的了。

1 ZGC从何而来,有什么好处

1.1 ZGC 的命名

根据OpenJDK官方网站的说明ZGC其实并没有什么特殊意义,就是一个名字而已。起初只是为了致敬ZFS 文件系统,表示ZGC与ZFS一样都是革命性的,是一个跨时代的产品。更像是一种崇拜命名法。所以ZGC就是要做革命性的与以往的垃圾回收器性能上有很大提高的GC。

1.2ZGC的好处及特点

ZGC是一个低延迟的可扩展GC,它有以下的目标

  1. 亚毫秒级别的时间延迟 (就是不超过1毫秒。)

    下图是SPEC做出的测试对比,Java16中ZGC 已经可做到亚毫秒级别的延迟了

图片

2. 暂停时间不会随着堆的大小、存活集、根集的大小的增加而增加
3. 支持8MB-16TB级别的堆大小

同时ZGC有如下标签

  • 并发
  • 基于Region
  • 堆压缩
  • 彩色指针 (对象使用64的指针,有44位表示对象内存地址(如果是8TB , 4TB堆内存则会用到43,42位) ,其中有4位用于GC, 其余为备用 ),个别详情请看 http://hg.openjdk.java.net/jdk/jdk/rev/24f6b0e413a0

图片

  • 负载屏障
  • NUMA支持 (每个CPU单独访问一块内存)

2 ZGC如何使用及调优

2.1 ZGC支持那些系统

图片

直至Java17 ZGC基本支持所有的主流系统。

2.2 ZGC可用的调优参数

尽管ZGC有比较大的改动,但是它仍然可以使用绝大部分的GC参数。当然它也有其特有的参数。

2.2.1 ZGC 通用的参数

-XX:MinHeapSize, -Xms 最小堆大小 (default = 8388608 = 8M)

-XX:InitialHeapSize, -Xms 初始化堆大小 (default = 134217728 = 128M )

-XX:MaxHeapSize, -Xmx 最大堆大小 (default = 2134900736 = 2036M)

-XX:SoftMaxHeapSize JVM堆的最大软限制 (default = 2134900736 = 2036M)

-XX:ConcGCThreads 并发GC的线程数量(default -XX:+ConcGCThreads=1 )

-XX:ParallelGCThreads 设置垃圾回收时的并行GC线程数量 (default = 4 )

-XX:UseLargePages 使用大页面内存 (dafault false)

-XX:UseTransparentHugePages 使用Transparent大页面内存

-XX:UseNUMA 使用UNMA内存分配,可以获得更好的性能

-XX:SoftRefLRUPolicyMSPerMB 每MB的空闲内存空间允许软引用对象存活时间(default = 1000)

-XX:AllocateHeapAt = 堆分配参数,可以使用非DRAM 内存,这个参数将指向文件系统的文件并使用内存映射来达到在备用存储设备上进行堆分配。

2.2.2 ZGC 特有的参数

-XX:ZAllocationSpikeTolerance 修正系数,数值越大,越早触发GC (default = 2.000000)

-XX:ZCollectionInterval ZGC发生的最小时间间隔 ,秒 (default = 0.000000)

-XX:ZFragmentationLimit relocation时,当前region碎片化大于此值,则回收region (default = 25.000000) -XX:ZMarkStackSpaceLimit 指定为标记堆栈分配的最大字节数 (default = 8589934592 = 8096M)

-XX:ZProactive 是否启用主动回收 (default true)

-XX:ZUncommit 是否归还不使用的内存给OS(default true)

-XX:ZUncommitDelay 不再使用的内存最多延迟多久会归还给OS (default = 300 s)

2.2.3 ZGC的一些诊断参数

-XX:+UnlockDiagnosticVMOptions 使用诊断模式,下面的参数才会起作用

-XX:ZStatisticsInterval 指定统计数据输出之间的时间间隔(秒)。

-XX:ZVerifyForwarding 检验转发表 -XX:ZVerifyMarking 检验标记集

-XX:ZVerifyObjects 检验对象 -XX:ZVerifyRoots 检验根节点

-XX:ZVerifyViews 检验堆视图访问

2.3 启用ZGC

-XX:+UseZGC 启用ZGC

-XX:+UseZGC -Xmx-Xlog:gc

-XX:+UseZGC -Xmx-Xlog:gc* 可以打印更详细的GC日志

2.4 可优化参数详解

2.4.1 堆参数的设置

ZGC比较重要的调优参数是设置最大堆内存(-Xmx)., ZGC设置一个最大堆内存有两个考量:1.堆可以容纳程序的存活集 2.堆中要有足够的空间允许GC运行时分配.

然而多大内存合适这就要根据 内存使用情况以及GC频率来确定。

2.4.2 并发GC线程数设置

另一个调优参数就是并发GC线程数量的设置 (-XX:ConcGCThreads=) 。

一般情况下ZGC可以自动选择一个合适的值,但是也要根据程序的特点来修改。这个参数对GC使用CPU的时间影响比较大,如果数量太大的话,GC线程会占用过多的CPU时间,数量过少的话垃圾回收有会不及时。通常情况下如果程序的低延迟很重要,那么CPU使用率最好永远不要超过70%。

2.4.3 将不用的内存返回给OS

默认情况下,ZGC会将不使用的内存还给OS。可以使用XX:-ZUncommit 取消这一功能。然而如果实际堆内存比最小堆内存都小的话,肯定不会将不使用的内存返还给OS,另外最大堆内存(-Xmx)和最小堆内存 (-Xms) 的设置相等的话,也不会起作用。

另外可以设置延迟归还对内存的时间 -XX:ZUncommitDelay=

2.4.4 在Linux中开启大页支持

在Linux操作系统中,采用内存映射来管理内存,逻辑页面映射到对应的物理内存,

使用大页面这个参数在吞吐量,低延迟,启动时间方面都有很好的性能提升,可以说除了设置起来有点复杂之外,没有任何的缺点。设置这个参数需要Root权限,所以默认没有开启。

2.4.5 Linux中使用大透明页

Linux下的大页分为两种标准,大页(Huge Pages)和透明大页(Transparent Huge Pages)。大页是预分配的方式管理,透明大页是动态分配的方式。我们可以使用这个参数-XX:+UseTransparentHugePages 来使用 transparent huge pages .对延迟要求很高的程序而言,这个参数是不推荐使用的,它可能会造成不必要的延迟峰值。

2.4.6 配置NUMA的支持

NUMA(非一致性内存访问)是Intel为了解决SMP多CPU结构中中线访问方式中资源竞争和一致性问题引起的。ZGC支持NUMA,此特性是默认开启的,它可以自主判断系统是否支持NUMA。如果在支持NUMA的机器上运行,那么将有显著的性能提升。

3 ZGC垃圾回收流程简述

3.1 ZGC同G1类似,也将内存分为Regions, 叫做ZPages。ZPages可以动态的创建和销毁,而且还可以动态的变化大小,无论怎么变化均为2MB 的倍数。

ZGC的堆区可以分为Small(2MB) Medium(32MB) Large(N*2MB)等多个Heap Regions. 其中Medium和Large是连续分配的内存。

ZGC的垃圾回收一般可以分为已下几个步骤流程。

  1. Pause Mark Start
    这个阶段会有 STW ,主要对Root集进行扫描,标记Root集中存活对象,即标记根可达对象。
  2. Concurrent Mark/Remap
    并发标记阶段,根据上一步标记的根对象去遍历对象图,并标记存活对象,主要根据上一步的Root存活对象标记其对象树上的对象。
  3. Pause Mark End
    标记结束,此处有 STW ,算再标记阶段,由于之前标记的时候程序也在运行,此时会有对象引用的变更,此处会对那些变更引用的对象重新标记一下。此时也会清理一些Root对象以及无效空间。
  4. Concurrent Prepare for Relocate
    并发标记Region及处理弱根对象 ,标记需要整理的Region集合,并选择下一步Relocation要用到的Region集合,也会处理不是强根的对象。
  5. Pause Relocate Start
    开始Relocate,此处有 STW ,处理Root对象的指针,此时会将Roots的对象移动到选好的Region集合中。
  6. Concurrent Relocate
    并发Relocate,此时并发执行,将存活对象移动到上一步选好的新的Region集合中。然后就是清理被释放的分区,等等工作。

可以看出来ZGC整体使用了标记复制加整理的思想,不过ZGC可以根据当前的内存使用情况,选择将存活对象整理到一个全新的空Region集合中或者某个存有对象的Region中。由于整个GC的流程中只有三处需要暂停,然而这三处的STW时间都是亚毫秒级别。整个GC的流程延迟总体会小于1ms。

图片

总结

本片总体概括了介绍了比较成熟的ZGC,介绍了ZGC的一些重要调优参数,讲解了一下ZGC的垃圾回收流程。相信各位看官也有所收获。目前ZGC的应用比较少,但随着Java17的正式推出,那么ZGC必然会逐渐成为主流GC。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2951

    浏览量

    104452
  • 参数
    +关注

    关注

    11

    文章

    1746

    浏览量

    32014
  • 文件系统
    +关注

    关注

    0

    文章

    284

    浏览量

    19869
收藏 人收藏

    评论

    相关推荐

    固态硬盘垃圾回收方法

    由于NAND闪存的固有限制,写前擦除和擦除粒度较大,基于NAND Flash的固态硬盘(SSD)需要执行垃圾回收以重用失效页。然而垃圾回收带来的高开销会显著降低SSD的性能,也会直接影
    发表于 12-03 10:50 2次下载
    固态硬盘<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>方法

    基于逻辑区间热度的垃圾回收算法

    针对现有的NAND闪存垃圾回收算法中回收性能不高,磨损均衡效果差,并且算法内存开销大的问题,提出了一种基于逻辑区间热度的垃圾回收算法。该算法
    发表于 12-05 18:27 0次下载
    基于逻辑区间热度的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    电子垃圾回收产业的隐秘世界

    如今的电脑和手机等电子设备换代频繁、淘汰迅速,因此电子垃圾回收利用也成了一个在全球蓬勃发展的产业。
    发表于 01-22 19:20 1.1w次阅读

    Jvm垃圾回收机制及性能调优实战

    JVM中自动检测并移除不再使用的数据对象的这种机制称为:垃圾回收,简称GC。JVM通过使用垃圾收集器及使用相应的垃圾回收算法将内存中不再被使
    发表于 04-03 14:31 2次下载

    交大发布可回收垃圾分拣机器人,实现助力全国垃圾分类回收工作

    6月4日消息,交大中英国际低碳学院可回收垃圾分拣机器人,更是打破国外技术垄断,可实现每小时分拣垃圾5400次,并在大量垃圾中精准识别可回收
    的头像 发表于 06-04 14:31 2933次阅读

    智能垃圾回收机器人的应用优势是什么

    为什么需要垃圾回收机器人? 首先,垃圾分类回收是实现地球资源循环利用至关重要的一环,对于可持续发展有重大意义。垃圾分类也是对付
    发表于 07-22 09:26 2013次阅读

    智能垃圾回收机器人的应用优势有哪些

    为什么需要垃圾回收机器人? 首先,垃圾分类回收是实现地球资源循环利用至关重要的一环,对于可持续发展有重大意义。垃圾分类也是对付
    发表于 08-17 16:08 4179次阅读

    生活垃圾数据化分类回收方法及其回收系统(机械部分)

    一种生活垃圾数据化分类回收方法及其回收系统(机械部分)(1).doc 上传完成 删除 标题一种生活垃圾数据化分类回收方法及其
    发表于 11-05 18:18 0次下载

    详解JVM的垃圾回收算法和垃圾回收

    JVM 垃圾回收机制是对堆中没有使用的对象进行回收,那么判断对象是否“存活”就至关重要。在判断对象是否“存活”的方法中,我们会介绍引用计数算法和可达性分析法。
    的头像 发表于 03-29 13:55 1458次阅读
    详解JVM的<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法和<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>器

    Kubernetes容器垃圾回收的策略

    Kubernetes的垃圾回收由kubelet进行管理,每分钟会查询清理一次容器,每五分钟查询清理一次镜像。在kubelet刚启动时并不会立即进行GC,即第一次进行容器回收为kubelet启动一分钟后,第一次进行镜像
    的头像 发表于 08-15 09:16 1464次阅读

    JVM入门之垃圾回收算法

    根据如何判定对象是垃圾垃圾回收算法分为两类:1、 「引用计数式垃圾收集」 (判定垃圾是通过引用计数器)别名:直接
    的头像 发表于 02-10 11:40 760次阅读
    JVM入门之<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>算法

    一文详解ZGC关键技术

    ZGC是如何设计怎么达到这个目标的呢?本文将从ZGC算法的关键特性入手,通过分析ZGC周期处理过程来理解这些特性,探索ZGC设计思想。
    发表于 10-23 18:26 599次阅读
    一文详解<b class='flag-5'>ZGC</b>关键技术

    智能垃圾回收箱及其控制系统

    智能高效远程控制智能垃圾回收箱本文设计了基于机械传动、嵌入式系统和物联网技术的智能垃圾回收箱及控制系统,包括结构、硬件和软件设计,以及基于机智云后台服务器的操作系统,实现了用户信息识
    的头像 发表于 04-13 08:10 1065次阅读
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱及其控制系统

    智能垃圾回收箱控制系统硬件设计

    智能高效远程控制智能垃圾回收箱控制系统硬件部分的选型与设计是整个产品的基础,所有功能的实现都要围绕其进行开发。本章对智能垃圾回收箱控制系统的硬件进行详细设计。智能
    的头像 发表于 04-13 08:10 744次阅读
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱控制系统硬件设计

    智能垃圾回收箱功能实验

    需要系统地介绍智能垃圾回收箱软件硬件设计完成后的设备运行状况,包括正常工作和问题调试。同时,也要描述当所有设备正常工作时智能垃圾回收箱的操作流程
    的头像 发表于 05-24 08:10 375次阅读
    智能<b class='flag-5'>垃圾</b><b class='flag-5'>回收</b>箱功能实验