首页 > 其他分享 >20.ZGC详解

20.ZGC详解

时间:2024-10-20 19:21:20浏览次数:10  
标签:触发 20 对象 详解 GC 内存 ZGC 页面

一、ZGC概念

1.介绍

    ZGC(The Z Garbage Collector)是JDK 11中推出的一款追求极致低延迟的垃圾收集器;

      停顿时间不超过10ms(JDK16已经达到不超过1ms);

      停顿时间不会随着堆的大小,或者活跃对象的大小而增加;

      支持8MB~4TB级别的堆,JDK15后已经可以支持16TB。

2.ZGC中的内存布局

    1.ZGC将内存划分成小的分区,在ZGC中称为页面(page)

    2.ZGC中没有分代的概念(新生代、老年代)

    3.ZGC支持3种页面,分别为小页面(最大2M)、中页面(最大32M)和大页面(操作系统影响)

    4.回收策略:小页面优先回收,中页面和大页面尽量不回收;

为什么这么设计?

    现代硬件架构的发展,提升性能

3.ZGC支持NUMA

    在过去,对于X86架构的计算机,内存控制器还没有整合进CPU,所有对内存的访问都需要通过北桥芯片来完成。X86系统中的所有内存都可以通过CPU进行同等访问。任何CPU访问任何内存的速度是一致的,不必考虑不同内存地址之间的差异,这称为“统一内存访问”(Uniform Memory Access,UMA)。UMA系统的架构示意图如图所示。

    在UMA中,各处理器与内存单元通过互联总线进行连接,各个CPU之间没有主从关系。之后的X86平台经历了一场从“拼频率”到“拼核心数”的转变,越来越多的核心被尽可能地塞进了同一块芯片上,各个核心对于内存带宽的争抢访问成为瓶颈,所以人们希望能够把CPU和内存集成在一个单元上(称Socket),这就是非统一内存访问(Non-Uniform Memory Access,NUMA)。很明显,在NUMA下,CPU访问本地存储器的速度比访问非本地存储器快一些。下图所示是支持NUMA处理器架构示意图。

    ZGC是支持NUMA的,在进行小页面分配时会优先从本地内存分配,当不能分配时才会从远端的内存分配。对于中页面和大页面的分配,ZGC并没有要求从本地内存分配,而是直接交给操作系统,由操作系统找到一块能满足ZGC页面的空间。ZGC这样设计的目的在于,对于小页面,存放的都是小对象,从本地内存分配速度很快,且不会造成内存使用的不平衡,而中页面和大页面因为需要的空间大,如果也优先从本地内存分配,极易造成内存使用不均衡,反而影响性能。

二、ZGC的核心概念

1.颜色指针(Color Pointers)

1.颜色指针是ZGC核心概念,在指针中借了几位,只支持64位系统,不能进行指针压缩;

2.ZGC中最低42位表示使用堆空间;

3.ZGC借高几位表示垃圾回收中的并发标记、转移和重定位等。

2.ZGC流程

主要有标记(标识垃圾)和转移(对象复制或移动)2个阶段;

2.1.初始标记

这个阶段需要暂停(STW),初始标记只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,停顿时间不会随着堆的大小或者活跃对象的大小而增加。

2.2.并发标记

这个阶段不需要暂停(没有STW),扫描剩余的所有对象,这个处理时间比较长,所以走并发,业务线程与GC线程同时运行。但是这个阶段会产生漏标问题。

2.3.再标记

这个阶段需要暂停(没有STW),主要处理漏标对象,通过SATB算法解决(G1中的解决漏标的方案)。

2.4.并发转移准备

分析最有价值GC分页

2.5.初始转移

转移初始标记的存活对象同时做对象重定位

2.6.并发转移

对转移并发标记的存活对象做转移

初始标记:从根集合(GC Roots)出发,找出根集合直接引用的活跃对象(根对象)

并发标记:根据初始标记找到的根对象,使用深度优先遍历对象的成员变量进行标记

3.GC roots可达性算法

    用来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。

作为GC Roots的对象主要包括下面4种

  • 虚拟机栈(栈帧中的本地变量表):各个线程调用方法堆栈中使用到的参数、局部变量、临时变量等。
  • 方法区中类静态变量:java类的引用类型静态变量。
  • 方法区中常量:比如:字符串常量池里的引用。
  • 本地方法栈中JNI指针:(即一般说的Native方法

三、ZGC读屏障

ZGC中的读屏障

涉及对象:并发转移但还没做对象重定位的对象(着色指针使用M0和M1可以区分)

触发时机:在两次GC之间业务线程访问这样的对象

触发操作:对象重定位+删除转发表记录(两个一起做原子操作)

读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。

需要注意的是,仅“从堆中读取对象引用”才会触发这段代码。

四、ZGC中GC触发机制(JAVA16)

1.预热规则

服务刚启动时出现,一般不需要关注。日志中关键字是“Warmup”。

JVM启动预热,如果从来没有发生过GC,则在堆内存使用超过10%、20%、30%时,分别触发一次GC,以收集GC数据.

2.基于分配速率的自适应算法

最主要的GC触发方式(默认方式),其算法原理可简单描述为”ZGC根据近期的对象分配速率以及GC时间,计算出当内存占用达到什么阈值时触发下一次GC”。通过ZAllocationSpikeTolerance参数控制阈值大小,该参数默认2,数值越大,越早的触发GC。日志中关键字是“Allocation Rate”。

3.基于固定时间间隔

通过ZCollectionInterval控制,适合应对突增流量场景。流量平稳变化时,自适应算法可能在堆使用率达到95%以上才触发GC。流量突增时,自适应算法触发的时机可能会过晚,导致部分线程阻塞。我们通过调整此参数解决流量突增场景的问题,比如定时活动、秒杀等场景。

4.主动触发规则

类似于固定间隔规则,但时间间隔不固定,是ZGC自行算出来的时机,我们的服务因为已经加了基于固定时间间隔的触发机制,所以通过-ZProactive参数将该功能关闭,以免GC频繁,影响服务可用性。

5.阻塞内存分配请求触发

当垃圾来不及回收,垃圾将堆占满时,会导致部分线程阻塞。我们应当避免出现这种触发方式。日志中关键字是“Allocation Stall”。

6.外部触发

代码中显式调用System.gc()触发。 日志中关键字是“System.gc()”。

7.元数据分配触发

元数据区不足时导致,一般不需要关注。 日志中关键字是“Metadata GC Threshold”。

五、ZGC参数设置

ZGC 优势不仅在于其超低的 STW 停顿,也在于其参数的简单,绝大部分生产场景都可以自适应。当然,极端情况下,还是有可能需要对 ZGC 个别参数做个调整,大致可以分为三类:

  • 堆大小:Xmx。当分配速率过高,超过回收速率,造成堆内存不够时,会触发 Allocation Stall,这类 Stall 会减缓当前的用户线程。因此,当我们在 GC 日志中看到 Allocation Stall,通常可以认为堆空间偏小或者 concurrent gc threads 数偏小。
  • GC 触发时机:ZAllocationSpikeTolerance, ZCollectionInterval。ZAllocationSpikeTolerance 用来估算当前的堆内存分配速率,在当前剩余的堆内存下,ZAllocationSpikeTolerance 越大,估算的达到 OOM 的时间越快,ZGC 就会更早地进行触发 GC。ZCollectionInterval 用来指定 GC 发生的间隔,以秒为单位触发 GC。
  • GC 线程:ParallelGCThreads, ConcGCThreads。ParallelGCThreads 是设置 STW 任务的 GC 线程数目,默认为 CPU 个数的 60%;ConcGCThreads 是并发阶段 GC 线程的数目,默认为 CPU 个数的 12.5%。增加 GC 线程数目,可以加快 GC 完成任务,减少各个阶段的时间,但也会增加 CPU 的抢占开销,可根据生产情况调整。

由上可以看出 ZGC 需要调整的参数十分简单,通常设置 Xmx 即可满足业务的需求,大大减轻 Java 开发者的负担。

六、ZGC典型应用场景

对于性能来说,不同的配置对性能的影响是不同的,如充足的内存下即大堆场景,ZGC 在各类 Benchmark 中能够超过 G1 大约 5% 到 20%,而在小堆情况下,则要低于 G1 大约 10%;不同的配置对于应用的影响不尽相同,开发者需要根据使用场景来合理判断。

当前 ZGC 不支持压缩指针和分代 GC,其内存占用相对于 G1 来说要稍大,在小堆情况下较为明显,而在大堆情况下,这些多占用的内存则显得不那么突出。因此,以下两类应用强烈建议使用 ZGC 来提升业务体验:

  • 超大堆应用。超大堆(百 G 以上)下,CMS 或者 G1 如果发生 Full GC,停顿会在分钟级别,可能会造成业务的终端,强烈推荐使用 ZGC。
  • 当业务应用需要提供高服务级别协议(Service Level Agreement,SLA),例如 99.99% 的响应时间不能超过 100ms,此类应用无论堆大小,均推荐采用低停顿的 ZGC。

七、ZGC生产注意事项

1.RSS 内存异常现象

由前面 ZGC 原理可知,ZGC 采用多映射 multi-mapping 的方法实现了三份虚拟内存指向同一份物理内存。而 Linux 统计进程 RSS 内存占用的算法是比较脆弱的,这种多映射的方式并没有考虑完整,因此根据当前 Linux 采用大页和小页时,其统计的开启 ZGC 的 Java 进程的内存表现是不同的。在内核使用小页的 Linux 版本上,这种三映射的同一块物理内存会被 linux 的 RSS 占用算法统计 3 次,因此通常可以看到使用 ZGC 的 Java 进程的 RSS 内存膨胀了三倍左右,但是实际占用只有统计数据的三分之一,会对运维或者其他业务造成一定的困扰。而在内核使用大页的 Linux 版本上,这部分三映射的物理内存则会统计到 hugetlbfs inode 上,而不是当前 Java 进程上。

2.共享内存调整

ZGC 需要在 share memory 中建立一个内存文件来作为实际物理内存占用,因此当要使用的 Java 的堆大小大于 /dev/shm 的大小时,需要对 /dev/shm 的大小进行调整。通常来说,命令如下(下面是将 /dev/shm 调整为 64G):

vi/etc/fstabtmpfs /dev/shm tmpfs defaults,size= 65536M00

首先修改 fstab 中 shm 配置的大小,size 的值根据需求进行修改,然后再进行 shm 的 mount 和 umount。

umount/dev/shmmount /dev/shm

3.mmap 节点上限调整

ZGC 的堆申请和传统的 GC 有所不同,需要占用的 memory mapping 数目更多,即每个 ZPage 需要 mmap 映射三次,这样系统中仅 Java Heap 所占用的 mmap 个数为 (Xmx / zpage_size) * 3,默认情况下 zpage_size 的大小为 2M。

为了给 JNI 等 native 模块中的 mmap 映射数目留出空间,内存映射的数目应该调整为 (Xmx / zpage_size) 3*1.2。

默认的系统 memory mapping 数目由文件 /proc/sys/vm/max_map_count 指定,通常数目为 65536,当给 JVM 配置一个很大的堆时,需要调整该文件的配置,使得其大于 (Xmx / zpage_size) 3*1.2。

标签:触发,20,对象,详解,GC,内存,ZGC,页面
From: https://blog.csdn.net/Csdn_xzh/article/details/143096771

相关文章

  • 19.JVM调优常量池详解
    一、GC日志详解1.常用参数对于java应用我们可以通过一些配置把程序运行过程中的gc日志全部打印出来,然后分析gc日志得到关键性指标,分析GC原因,调优JVM参数。打印GC日志方法,在JVM参数里增加参数,%t代表时间-Xloggc:./gc-%t.log-XX:+PrintGCDetails-XX:+PrintGCDateStamps-X......
  • CTF杂项——[LitCTF 2023]OSINT 探姬去哪了?_0
    中国电信查看属性 发现经纬度经纬度转换搜索地址  发现在浙江省嘉兴市秀洲区高德地图上搜索依次试验  发现是中国电信大厦......
  • 2024-2025-1 20241307《计算机基础与程序设计》第四周学习总结
    作业信息这个作业属于哪个课程(2024-2025-1-计算机基础与程序设计)这个作业要求在哪里(2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标作业正文(2024-2025-1学号20241307《计算机基础与程序设计》第四周学习总结)教材学习内容总结第二章主要介......
  • 2024-2025-1 20241415《计算机基础与程序设计》第四周学习总结
    2024-2025-120241415《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标门电路、组合电路、逻......
  • 2024.10.20 1859版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 集成Spring Security详解
    集成SpringSecurity详解一、SpringSecurity简介SpringSecurity是一个功能强大且高度可定制的身份验证和访问控制框架,它专注于为Java应用程序提供全面的安全解决方案。作为Spring项目的一部分,SpringSecurity继承了Spring框架的灵活性和可扩展性,能够轻松地集成到任何Spr......
  • 【IC】Adobe InCopy 图像编辑功能、win/mac下载与快捷键使用(2017-2024)
    目录一、AdobeIC功能介绍1.1核心功能1.2智能编辑与多平台支持二、AdobeIC下载2.1下载安装包2.2下载与安装步骤三、AdobeIC快捷键使用3.1文本编辑快捷键3.2视图与导航快捷键3.3协作与批注快捷键一、AdobeIC功能介绍1.1核心功能编辑与排版:AdobeI......
  • 如2024-2025 20241425 《计算机基础与程序设计》第4周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/homework/13276这个作业的目标1、门电路2、组合电路,逻辑电路3、冯诺依曼结构4、CPU,内存,IO管理......
  • 20222423 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实验内容1.1实践内容正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧使用msfvenom生成jar、apk等其他文件使用veil加壳工具使用C+shellcode进行编程通过组合应用各种技术实现恶意代码免杀用另一电脑实测,在杀软开启的情况下,可运行并回连......
  • 【AU2024】Adobe 音频编辑和制作软件Audition(简称AU)WIN/MAC下载及使用教程
    AdobeAU软件简介AdobeAudition(简称AU)是一款由Adobe公司开发的音频编辑和制作软件,前身为CoolEditPro,于2003年被Adobe收购并更名为Audition。AU以其强大的音频处理能力、丰富的音频效果和直观的操作界面,广泛应用于配音、电台广播、音乐制作等多个领域。它不仅支持音频的录制......