【JVM】—深入理解ZGC回收器—背景概念回收流程

news2024/10/19 8:33:32

深入理解ZGC回收器—背景概念&回收流程

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

文章目录

  • 深入理解ZGC回收器—背景概念&回收流程
    • 1 ZGC诞生的背景
      • 1.1 GC之痛
      • 1.2 CMS与G1瓶颈
    • 2 ZGC特点
      • 2.1目标
      • 2.2 性能表现
    • 3 ZGC流程简介


关于JVM回收器的前置知识点:

  • 【JVM】—Java内存区域详解
  • 【JVM】—JVM垃圾回收详解
  • 【JVM】—深入理解G1回收器——概念详解
  • 【JVM】—深入理解G1回收器—回收过程详解
  • 【JVM】—G1中的Young GC、Mixed GC、Full GC详解
  • 【JVM】—G1 GC日志详解

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

  • 停顿时间不超过10ms;
  • 停顿时间不会随着堆的大小,或者活跃对象的大小而增加;
  • 支持8MB~4TB级别的堆(未来支持16TB)。

1 ZGC诞生的背景

1.1 GC之痛

STW(Stop-The-World)问题是垃圾回收过程中所有应用线程被强制暂停等待垃圾回收完成的现象,这会导致应用程序响应延迟,影响用户体验和系统性能,特别是在处理大量数据或高并发请求的场景下,STW问题更为突出,成为优化高性能应用的关键挑战。例如,在在线游戏服务器、金融交易系统或实时数据分析平台中,STW现象可能导致玩家体验卡顿、交易延迟或数据处理中断,严重影响系统稳定性和用户满意度。这些场景对延迟极其敏感,STW问题的出现会直接损害业务运行效率。为解决这个问题,一款跨时代的垃圾回收器ZGC诞生。

1.2 CMS与G1瓶颈

在介绍ZGC之前,首先回顾一下CMS和G1的GC过程以及停顿时间的瓶颈。CMS新生代的Young GC、G1和ZGC都基于标记-复制算法,但算法具体实现的不同就导致了巨大的性能差异。

标记-复制算法应用在CMS新生代(ParNew是CMS默认的新生代垃圾回收器)和G1垃圾回收器中。标记-复制算法可以分为三个阶段:

  • 标记阶段,即从GC Roots集合开始,标记活跃对象;
  • 转移阶段,即把活跃对象复制到新的内存地址上;
  • 重定位阶段,因为转移导致对象的地址发生了变化,在重定位阶段,所有指向对象旧地址的指针都要调整到对象新的地址上

下面以G1为例,通过G1中标记-复制算法过程(G1的Young GC和Mixed GC均采用该算法),分析G1停顿耗时的主要瓶颈。G1垃圾回收周期如下图所示:

在这里插入图片描述

G1的混合回收过程可以分为标记阶段、清理阶段和复制阶段。

标记阶段停顿分析

  • 初始标记阶段:初始标记阶段是指从GC Roots出发标记全部直接子节点的过程,该阶段是STW的。由于GC Roots数量不多,通常该阶段耗时非常短;
  • 并发标记阶段:并发标记阶段是指从GC Roots开始对堆中对象进行可达性分析,找出存活对象。该阶段是并发的,即应用线程和GC线程可以同时活动。并发标记耗时相对长很多,但因为不是STW,所以我们不太关心该阶段耗时的长短;
  • 再标记阶段:重新标记那些在并发标记阶段发生变化的对象。该阶段是STW的

清理阶段停顿分析

  • 清理阶段清点出有存活对象的分区和没有存活对象的分区,该阶段不会清理垃圾对象,也不会执行存活对象的复制。该阶段是STW的。

复制阶段停顿分析

  • 复制算法中的转移阶段需要分配新内存和复制对象的成员变量。转移阶段是STW的,其中内存分配通常耗时非常短,但对象成员变量的复制耗时有可能较长,这是因为复制耗时与存活对象数量与对象复杂度成正比。对象越复杂,复制耗时越长。

四个STW过程中,初始标记因为只标记GC Roots,耗时较短。再标记因为对象数少,耗时也较短。清理阶段因为内存分区数量少,耗时也较短。转移阶段要处理所有存活的对象,耗时会较长。因此,G1停顿时间的瓶颈主要是标记-复制中的 转移阶段 STW。

为什么转移阶段不能和标记阶段一样并发执行呢?

主要是G1未能解决转移过程中准确定位对象地址的问题。

G1的Young GC和CMS的Young GC,其标记-复制全过程STW,这里不再详细阐述。

2 ZGC特点

2.1目标

在这里插入图片描述

  • 低延迟保证:ZGC旨在将垃圾回收引起的暂停时间控制在毫秒级别,即使在处理TB级堆内存的情况下,也能保持极低的停顿时间,非常适合对延迟敏感的应用。
  • 并行与并发处理:ZGC充分利用多核处理器的能力,实现并行的垃圾回收操作,并且在部分阶段能够与应用线程并发执行,极大减少了STW事件的发生,提高了系统的整体响应速度。
  • 可扩展性: ZGC针对现代数据中心的大内存环境进行了优化,支持从几GB到数TB的堆大小,适应了从小型服务器到大规模集群的广泛部署场景。
  • 无碎片内存管理: 通过实现无碎片的内存分配和回收机制,ZGC避免了内存碎片化问题,简化了内存管理,从而提升了内存使用效率和应用性能。
  • 自适应调整:ZGC具备智能的自适应能力,能够根据系统当前的负载情况动态调整垃圾回收策略,确保在不同工作负载下都能维持良好的性能表现。
  • 详尽的性能监控: 提供了丰富的垃圾回收日志和监控工具,帮助开发者深入理解ZGC的行为,进行性能调优,确保应用在各种条件下都能达到最优状态。

2.2 性能表现

  1. 从最大吞吐量与关键吞吐量指标观察,可以看出ZGC在关键吞吐量表现很突出

在这里插入图片描述

  1. 从停顿时间指标来观察,停顿时间是 断崖式领先

在这里插入图片描述

3 ZGC流程简介

在这里插入图片描述

  1. 初始标记阶段:
    ZGC初始化时会为堆分配内存,并将所有对象标记为“存活”状态。

  2. 并发标记阶段:
    这个阶段主要识别哪些对象是不再使用的。ZGC使用了基于Card Table的追踪算法(G1中的CSet与RSet概念)来发现引用关系。标记过程是并发的,意味着它可以与应用程序的执行同时进行,以减少停顿时间。在这个过程中,ZGC会维护一个引用队列,用于跟踪新创建的对象或更新的引用。

  3. 再标记阶段:
    虽然ZGC的目标是最小化暂停时间,但仍然需要短暂的暂停来安全地重定位对象。
    在这个短暂的暂停期间,ZGC会更新根集(如线程栈、JNI全局引用等)和其他需要更新的地方,确保所有引用指向正确的位置。对象被移动到新的位置,以优化内存布局和减少碎片。

  4. 并发转移准备阶段:
    这个阶段是在上一步暂停之后开始的,它是并发执行的,准备重定位对象。ZGC会计算每个区域中的对象需要移动的距离,以及更新引用所需的更改。

  5. 初始转移阶段:
    在此阶段,ZGC实际移动对象并更新引用

  6. 并发转移阶段:
    清理阶段 处理一些剩余的任务,如释放不再需要的内存块,更新元数据等。这个阶段也是并发的,对应用程序的影响最小。

但是,在一次GC之后,并 不会真正的执行完流程 ,它是需要两次GC才能完整的执行完一次垃圾回收,这就涉及到了后面要提到的指针着色技术,使用这样的技术极大的提升了效率。

ZGC关键技术详细介绍👉【JVM】—深入理解ZGC回收器—关键技术详解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2218346.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

韩信走马分油c++

韩信走马分油c 题目算法代码 题目 把油桶里还剩下的10斤油平分,只有一个能装3斤的油葫芦和一个能装7斤的瓦罐。如何分。 算法 油壶编号0,1,2。不同倒法有:把油从0倒进0(本壶到本壶,无效)&…

YoloV9改进策略:主干网络改进|DeBiFormer,可变形双级路由注意力|全网首发

摘要 在目标检测领域,YoloV9以其高效和准确的性能而闻名。然而,为了进一步提升其检测能力,我们引入了DeBiFormer作为YoloV9的主干网络。这个主干网络的计算量比较大,不过,上篇双级路由注意力的论文受到很大的关注&…

Centos7搭建minio对象存储服务器

Centos7搭建minio对象存储服务器 安装二进制程序配置服务文件 安装二进制程序 参考:https://segmentfault.com/q/1010000042181876 minio中国版:https://www.minio.org.cn/download.shtml#/linux # 下载二进制程序 wget https://dl.min.io/server/min…

matlab相位图

% 清空工作空间和命令窗口 clear; clc; % 模拟生成时间t,位移y(t)和角位移theta(t) t linspace(0, 100, 1000); % 时间从0到100,包含1000个点 y 1e-5 * sin(2 * pi * 0.1 * t) .* exp(-0.01 * t); % 位移y(t) 振荡衰减 theta 1e-6 * cos(2 * pi * …

第8篇:网络安全基础

目录 引言 8.1 网络安全的基本概念 8.2 网络威胁与攻击类型 8.3 密码学的基本思想与加密算法 8.4 消息认证与数字签名 8.5 网络安全技术与协议 8.6 总结 第8篇:网络安全基础 引言 在现代信息社会中,计算机网络无处不在,从互联网到局…

如何将 Docker 镜像的 tar 文件迁移到另一台服务器并运行容器

在 Docker 容器化的世界里,我们经常需要将容器从一个环境迁移到另一个环境。这可能是因为开发、测试或生产环境的需求。本文将详细介绍如何将 Docker 镜像的 tar 文件从一台服务器迁移到另一台服务器(IP 地址为 192.168.100.10),并…

深度学习每周学习总结J3(DenseNet-121算法实战与解析 - 鸟类识别)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 DenseNet 与 ResNet1. 设计理念2. 网络结构3. 与CNN和ResNet的对比补充:一些网络结构对比的网站(重要&#x…

【C++基础篇】——逐步了解C++

【C基础篇】——逐步了解C 文章目录 【C基础篇】——逐步了解C前言一、C的第一个程序二、命名空间1.namespace的价值2.namespace的定义3.命名空间的使用 三、C的输入&输出四、缺省参数五、函数重载六、引用1.引用的概念和定义:2.引用的特性3.引用的使用4.const引…

标准/开源版本,长连接无法启动

在配置长链接的时候,有时候会出现无法正常启动的问题,下面介绍几种情况,并给出解决办法 1、启动入下图所示,是因为你的php的禁用函数没有解禁,按照配置文档中的解禁所有禁用函数 2、检查你的反向代理是否配置正确&…

华山论剑之Rust的Trait

华山论剑,群雄荟萃,各显神通。武林中人,各有所长,或剑法飘逸,或掌法刚猛,或轻功绝顶。这就好比Rust中的trait,它定义了一种武功套路,而不同的门派、不同的人,可以将这套武…

shell脚本宝藏仓库(基础命令、正则表达式、shell基础、变量、逻辑判断、函数、数组)

一、shell概述 1.1 shell是什么 Shell是一种脚本语言 脚本:本质是一个文件,文件里面存放的是特定格式的指令,系统可以使用脚本解析器、翻译或解析指令并执行(shell不需要编译) Shell既是应用程序又是一种脚本语言&…

5.12 向内核传递信息(2)

首先是 设置 loard_16.c 中的 boot_info 这个变量, 这里最初保存的是 读取到的内存的信息。 然后是 增加跳转的函数。 然后就是 去改动 内核代码。 由于内核的代码最终 调用的是 kernel_init. 最关键的就是 这里了, call kernel_init 相当于 在调用一个…

阿里巴巴达摩院|Chain of Ideas: 利用大型语言模型代理革新新颖创意开发的研究

阿里巴巴集团达摩院|Chain of Ideas: 利用大型语言模型代理革新新颖创意开发的研究 🎯 推荐指数:🌟🌟🌟 📖 title:Chain of Ideas: Revolutionizing Research in Novel Idea Develop…

C++ | Leetcode C++题解之第492题构造矩形

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> constructRectangle(int area) {int w sqrt(1.0 * area);while (area % w) {--w;}return {area / w, w};} };

【十】Hyperf最简单的使用rabbitMQ

配置.env文件 AMQP_HOST192.168.86.102 AMQP_PORT5672 AMQP_USERrabbitmq AMQP_PASSWORDrabbitmq AMQP_VHOSTmy-test配置文件 生产者 消费者(注意&#xff1a;里面的num在实际使用的时候&#xff0c;至少为1&#xff0c;不然没有消费者队列来执行里面的操作) 调用&#xff0c;…

【在Linux世界中追寻伟大的One Piece】应用层自定义协议|序列化

目录 1 -> 应用层 2 -> 网络版计算器 3 -> 序列化与反序列化 4 -> 重新理解read、write、recv、send和tcp为什么支持全双工 5 -> 开始实现 5.1 -> 定制协议 5.2 -> 关于流式数据的处理 1 -> 应用层 应用层是OSI模型或TCP/IP模型中的最高层&…

【C++贪心】2712. 使所有字符相等的最小成本|1791

本文涉及知识点 C贪心 LeetCode2712. 使所有字符相等的最小成本 给你一个下标从 0 开始、长度为 n 的二进制字符串 s &#xff0c;你可以对其执行两种操作&#xff1a; 选中一个下标 i 并且反转从下标 0 到下标 i&#xff08;包括下标 0 和下标 i &#xff09;的所有字符&am…

软件设计模式------简单工厂模式

简单工厂模式&#xff08;Simple factory Pattern&#xff09;&#xff0c;又称静态工厂方法(Static Factory Method),属于创新型模式&#xff0c;但它不属于GoF23个设计模式其一。 一、模式动机&#xff1a; 有时需要创建一些来自相同父类的类的实例。 二、定义&#xff1a…

Java基于SpringBoot微信小程序的跳蚤市场系统设计与实现(lw+数据库+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

【数据分享】中国历史学年鉴(1979-2001)

数据介绍 目录如下&#xff1a; 特稿 2000年国际历史科学大会 史学研究 史学理论 西周春秋战国史 秦汉史 魏晋南北朝史 隋唐五代史 宋史 辽西夏金史 蒙元史 明史 清史 晚清政治史 近代文化史 中外关系史 近代经济史 近代社会史 近代思想史 民国政治史 世…