Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 新一代垃圾回收器 ZGC 收集器

news2024/11/13 21:41:31

文章目录

    • 垃圾回收机制
    • 垃圾收集器
      • 垃圾收集器分类
      • ZGC 收集器
        • ZGC 的性能优势
          • 复制算法
          • 指针染色
          • 读屏障
        • ZGC 的工作过程
          • Stop-The-World 暂停阶段
          • 并发阶段

垃圾回收机制

垃圾回收Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收

垃圾收集器

如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。Java 垃圾收集器(Garbage Collector, GC)是 Java 虚拟机(JVM)的一部分,它自动管理内存,回收不再使用的对象所占用的内存空间。这有助于防止内存泄漏,并且使得开发人员可以更专注于业务逻辑的编写而不是内存管理。

没有万能的垃圾收集器,只有根据具体应用场景选择适合自己的垃圾收集器。垃圾收集器是垃圾回收算法(如引用计数法、标记清除法、标记整理法、复制算法等)的具体实现。它的主要任务是识别并回收那些不再被程序使用的对象所占用的内存空间,从而避免内存泄漏和内存溢出的问题。

垃圾收集器分类

就目前来说,JVM 的垃圾收集器主要分为两大类:分代收集器分区收集器,分代收集器的代表是 CMS,分区收集器的代表是 G1ZGC

JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

JDK 默认垃圾收集器(使用 java -XX:+PrintCommandLineFlags -version 命令查看):

  • JDK 8:Parallel Scavenge(新生代)+ Parallel Old(老年代)
  • JDK 9 ~ JDK20: G1

在这里插入图片描述

ZGC 收集器

ZGC(Z Garbage Collector) 是一种低延迟、可伸缩性强的垃圾回收器,是JVM 中的一项重要技术。ZGC的目标是 尽可能地减少垃圾回收对应用程序的停顿时间,并且可以处理大内存堆

它于Java 11版本中正式发布,适用于大内存低延迟服务的内存管理和回收,在 128G 的大堆下,最大停顿时间为 1.68 ms,停顿时间远胜于 G1CMS

相关文章:新一代垃圾回收器ZGC的探索与实践 - 美团技术团队

通过下面的参数启动 ZGC:

$ java -XX:+UseZGC className

ZGC的设计原则是给予应用程序更多的时间来执行业务逻辑,以减少垃圾回收的停顿时间。它具有以下特点:

  1. 低停顿时间:ZGC 以毫秒为单位的短暂停顿时间作为目标,在控制在10ms以内。它通过并发的方式进行垃圾回收,减少对应用程序的影响。即使是大型堆内存,ZGC也能维持非常低的停顿时间。

  2. 可伸缩性:ZGC 的设计使其能够处理几个字节到数TB范围内的大型堆内存。它采用了柔性的并发策略,允许在并行、并发和单线程模式之间根据需要做出动态调整。

  3. 不需要设置-Xmx:与传统的垃圾回收器相比,ZGC不要求显式设置最大堆大小。ZGC可以自动按需调整堆的大小,并将内存释放给操作系统

  4. 一致的性能:ZGC致力于提供一致的性能,无论是小型应用还是大型内存应用,都希望能够获得稳定的延迟和吞吐量。

ZGC 的性能优势

G1CMS 类似,ZGC 也采用了复制算法

ZGC 在复制算法的基础上做了重大优化,ZGC 在标记、转移和重定位阶段几乎都是并发的,这是 ZGC 实现停顿时间小于 10ms 的关键所在。

  • ZGC 使用的是柔性并发(Colored Pointers) 的技术,通过将对象指针分成多个颜色(Colored)(指针染色技术),以实现并发的垃圾回收。

  • 它在垃圾回收过程中会对引用关系进行处理,并且可以并发复制和重定向对象。同时,ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。

复制算法

复制算法主要包括以下 3 个阶段:

  1. 标记阶段:从 GC Roots 开始,分析对象可达性,标记出活跃对象。

![[Pasted image 20240918174844.png]]

  1. 对象转移阶段:把活跃对象复制到新的内存地址上。

  2. 重定位阶段:因为转移导致对象地址发生了变化,在重定位阶段,所有指向对象旧地址的引用都要调整到对象新的地址上。

标记阶段因为只标记 GC Roots,耗时较短。但转移阶段和重定位阶段需要处理所有存活的对象,耗时较长,并且转移阶段是 STW 的,因此,G1 的性能瓶颈就主要在转移阶段。

![[Pasted image 20240918174856.png]]

指针染色

ZGC 在垃圾回收过程中会对引用关系进行处理,并且可以并发复制和重定向对象。同时,ZGC 还采用了读屏障技术来保护并发操作中的数据一致性。

在一个指针中,除了存储对象的实际地址外,还有额外的位被用来存储关于该对象的元数据信息。这些信息可能包括:

  • 对象是否被移动了(即它是否在回收过程中被移动到了新的位置)。
  • 对象的存活状态。
  • 对象是否被锁定或有其他特殊状态。

通过在指针中嵌入这些信息,ZGC 在标记和转移阶段会更快,因为通过指针上的颜色就能区分出对象状态,不用额外做内存访问。

ZGC 仅支持64位系统,它把64位虚拟地址空间划分为多个子空间,如下图所示:

![[Pasted image 20240917232735.png]]

其中:

  • 0-4TB 对应 Java 堆
  • 4TB-8TB 被称为 M0 地址空间
  • 8TB-12TB 被称为 M1 地址空间
  • 12TB-16TB 预留未使用
  • 16TB-20TB 被称为 Remapped 空间

当创建对象时,首先在堆空间申请一个虚拟地址,该虚拟地址并不会映射到真正的物理地址。同时,ZGC 会在 M0M1Remapped 空间中为该对象分别申请一个虚拟地址,且三个虚拟地址都映射到同一个物理地址。

下图是虚拟地址的空间划分:

![[Pasted image 20240917232802.png]]

三个空间在同一时间只有一个空间有效。ZGC 之所以设置这三个虚拟地址,是因为 ZGC 采用的是“空间换时间”的思想,去降低 GC 的停顿时间。与上述地址空间划分相对应,ZGC 实际仅使用64位地址空间的第0-41位,而第42-45位存储元数据第47-63位固定为0

![[Pasted image 20240917232909.png]]

由于仅用了第 0~43 位存储对象地址, 2 44 2^{44} 244 = 16TB,所以 ZGC 最大支持 16TB 的堆。而对象的存活信息,则存储在42-45位中,这与传统的垃圾回收并将对象存活信息放在对象头中完全不同。

读屏障

当程序尝试读取一个对象时,读屏障会触发以下操作:

  • 检查指针染色:读屏障首先检查指向对象的指针的颜色信息。

  • 处理移动的对象:如果指针表示对象已经被移动(例如,在垃圾回收过程中),读屏障将确保返回对象的新位置。

  • 确保一致性:通过这种方式,ZGC 能够在并发移动对象时保持内存访问的一致性,从而减少对应用程序停顿的需要。

读屏障可能被 GC 线程和业务线程触发,并且只会在访问堆内对象时触发,访问的对象位于 GC Roots 时不会触发,这也是扫描 GC Roots 时需要 Stop The World 的原因。

下面是一个简化的示例代码,展示了读屏障的触发时机。

Object o = obj.FieldA   // 从堆中读取引用,需要加入屏障
<Load barrier>
Object p = o            // 无需加入屏障,因为不是从堆中读取引用
o.dosomething()         // 无需加入屏障,因为不是从堆中读取引用
int i =  obj.FieldB     //无需加入屏障,因为不是对象引用
ZGC 的工作过程

ZGC 周期由三个 STW(Stop The World) 暂停和四个并发阶段组成:标记/重新映射(M/R)并发引用处理(RP)并发转移准备(EC)并发转移(RE)

![[Pasted image 20240917233221.png]]

![[Pasted image 20240917233324.png]]

Stop-The-World 暂停阶段
  1. 标记开始(Mark Start)STW 暂停:这是 ZGC 的开始,进行 GC Roots 的初始标记。在这个短暂的停顿期间,ZGC 标记所有从 GC Root 直接可达的对象。

  2. 重新映射开始(Relocation Start)STW 暂停:在并发阶段之后,这个 STW 暂停是为了准备对象的重定位。在这个阶段,ZGC 选择将要清理的内存区域,并建立必要的数据结构以进行对象移动。

  3. 暂停结束(Pause End)STW 暂停:ZGC 结束。在这个短暂的停顿中,完成所有与该 GC 周期相关的最终清理工作。

并发阶段
  1. 并发标记/重新映射 (M/R) :这个阶段包括并发标记和并发重新映射。在并发标记中,ZGC 遍历对象图,标记所有可达的对象。然后,在并发重新映射中,ZGC 更新指向移动对象的所有引用。

  2. 并发引用处理 (RP) :在这个阶段,ZGC 处理各种引用类型(如软引用、弱引用、虚引用和幽灵引用)。这些引用的处理通常需要特殊的考虑,因为它们与对象的可达性和生命周期密切相关。

  3. 并发转移准备 (EC) :这是为对象转移做准备的阶段。ZGC 确定哪些内存区域将被清理,并准备相关的数据结构。

  4. 并发转移 (RE) :在这个阶段,ZGC 将存活的对象从旧位置移动到新位置。由于这一过程是并发执行的,因此应用程序可以在大多数垃圾回收工作进行时继续运行。

ZGC 的两个关键技术:指针染色读屏障,不仅应用在并发转移阶段,还应用在并发标记阶段:将对象设置为已标记,传统的垃圾回收器需要进行一次内存访问,并将对象存活信息放在对象头中;而在 ZGC 中,只需要设置指针地址的第42-45位即可,并且因为是寄存器访问,所以速度比访问内存更快。

![[Pasted image 20240917233403.png]]

尽管ZGC在降低停顿时间方面表现出色,但与其他垃圾回收器相比,在某些特定场景或对于特定应用程序可能会有一些性能上的差异。因此,在选择垃圾回收器时需根据具体需求和应用程序特点进行评估和选择。

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

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

相关文章

第二期: 第11节, uboot 命令的使用

问题&#xff1a;如果你只想控制一个led 灯&#xff0c;并且不想去写驱动。 那么可以直接 使用uboot 的命令&#xff0c;去改写内存。 uboot 命令的解析&#xff1a; 读命令&#xff0c; md[.b, .w. .l] address 注意&#xff1a; 这里的 .w 指的是两个字节&#xff0c;…

1.Seata 1.5.2 seata-server搭建

一&#xff1a;Seata基本介绍 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 详见官网链接&#xff1a;https://seata.apache.org/zh-cn/ 1.历史项目里的使用经验&#xff1a; 之前公司里的oem用户对应的App…

时钟频率、AI采样率与AO更新率的关系

在数据采集和信号生成设备&#xff08;如NI板卡&#xff09;中&#xff0c;时钟频率、AI&#xff08;模拟输入&#xff09;采样率、以及AO&#xff08;模拟输出&#xff09;更新率是三个至关重要的参数。它们共同决定了设备在信号采集与生成时的性能表现。本文将详细分析它们之…

Yestar成都艺星引领行业星纪元:十大数字星品·高阶星技术震撼发布

近日&#xff0c;中国成都太古里Yestar十大数字星品高阶星技术AI科技3D Mapping全球发布会&#xff0c;震撼发布了十大数字星品高阶星技术升级&#xff0c;引领医美产业发展翻开崭新的一页。作为品牌成立19周年的庆典&#xff0c;这场科技与美学交融的盛会&#xff0c;标志着医…

ANSYS Workbench随机球体及过渡区三维混凝土细观建模

在ANSYS Workbench内建立随机球体及ITZ界面层混凝土细观模型可采用CAD随机球体颗粒&过渡区3D插件建模后将模型导入。 在插件内设置好模型参数后运行&#xff0c;插件会自动完成随机球体、界面过渡区、基体模型的建立。插件已将不同部件分图层进行建模&#xff0c;将模型整…

【PyCharm】和git安装教程

一、Git的下载和Pycharm工具中配置集成git和github 在Git官网下载安装包&#xff0c;如果官网下载速度慢&#xff0c;可以到百度云或者其他网页/迅雷等下载。 https://git-scm.com/download/win 下载完成后 按照默认一直下一步安装, 1、集成git 选择settings->Version C…

电脑监控多画面怎么弄?电脑监控如何多画面抓屏?四种方法分享给你了!

电脑监控多画面及多画面抓屏的实现方法多种多样&#xff0c;以下是四种常用的方法分享&#xff1a; 一、使用专业监控软件 优点&#xff1a; 功能强大&#xff1a;专业监控软件不仅支持多画面显示&#xff0c; 还具备屏幕快照、 屏幕录像、 远程操控等高级功能。 配置灵活&a…

中伟视界:皮带堵料监测的检测方法、理论依据与实践解析

皮带输送系统在矿山等工业环境中扮演着至关重要的角色。然而&#xff0c;皮带堵料问题常常导致生产效率降低、设备损坏&#xff0c;甚至可能引发安全事故。为了有效监测和预防皮带堵料&#xff0c;现代技术采用多种AI算法进行实时检测。本文将探讨几种皮带堵料监测的检测方法、…

Spring boot从0到1 - day01

前言 Spring 框架作为 Java 领域中最受欢迎的开发框架之一&#xff0c;提供了强大的支持来帮助开发者构建高性能、可维护的 Web 应用。 学习目标 Spring 基础 Spring框架是什么&#xff1f;Spring IoC与Aop怎么理解&#xff1f; Spring Boot 的快速构建 Spring 基础 学习…

【Python机器学习】NLP信息提取——正则模式

我们需要一种模式匹配算法&#xff0c;该算法可以识别与模式匹配的字符序列或词序列&#xff0c;以便从较长的文本字符串中“提取”它们。构建这种模式匹配算法的简单方法是在Python中&#xff0c;使用一系列if/else语句在字符串的逐个位置查找该符号&#xff08;单词或字符&am…

解决Gson将长数字( json字符串)转换为科学记数法格式

Gson&#xff08;又称Google Gson&#xff09;是Google公司发布的一个开放源代码的Java库&#xff0c;主要用途为序列化Java对象为JSON字符串&#xff0c;或反序列化JSON字符串成Java对象。 依赖 Gradle: dependencies {implementation com.google.code.gson:gson:2.11.0 }…

为什么制造业要上MES,有哪些不得不上的理由吗?

关于为什么制造业要上MES&#xff0c;以及有哪些不得不上的理由吗&#xff1f;以下分为三个部分给大家详细讲解。 一、MES是什么&#xff1f; MES是一个综合性系统&#xff0c;连接企业的ERP系统与生产现场操作层面。它通过实时数据采集、分析和监控&#xff0c;将计划与执行紧…

精准营销,高效获客:Xinstall如何为App增长赋能?

在移动互联网时代&#xff0c;App的推广和运营面临着前所未有的挑战。如何在海量用户中精准定位目标客户&#xff1f;如何实时追踪用户行为&#xff0c;优化推广策略&#xff1f;Xinstall作为一站式App全渠道统计服务商&#xff0c;以全渠道数据统计为核心&#xff0c;为App运营…

继承1 2024_9_18

1.继承的基本用法 当需要继承的时候,我们就在派生类的后面加上一个权限父类,这个权限可以是公有,保护和私有,后面就是继承的父类.此时,下面的stu这个派生类,也就可以使用Person里面的方法了. 2.继承基类成员访问方式的变化 当父类被继承到派生类的时候,此时会根据继承方式的不…

Qt 学习第十天:小项目:QListWidget的使用

一、页面布局 二、命名按钮 双击按钮可以修改显示中的文字&#xff08;例如&#xff1a;改成“全选”&#xff09;&#xff0c;objectName是要改成程序员所熟悉的名字&#xff08;英文&#xff0c;符合代码规范&#xff09;方便修改和书写代码&#xff0c;一看就能看懂的 三、…

亚马逊、沃尔玛、敦煌网、Target塔吉特、Temu环境搭建测评技术!

海外跨境电商各大主要平台正不断力推半托管模式&#xff0c;不断对商家开出众多吸引和扶持政策。全托管是指电商平台全面负责店铺的运营&#xff0c;包括仓储、配送、售后等&#xff0c;而商家主要负责提供货品。半托管模式则基本由商家自主经营&#xff0c;平台只负责仓配物流…

Xilinx系FPGA学习笔记(九)DDR3学习

系列文章目录 文章目录 系列文章目录前言DDR介绍DDR的IP核学习接口信号解析读写流程分析AXI 前言 这里暂时先只介绍一下IP核配置生成和一些接口信号的含义&#xff0c;后续还需要补很多知识点和实际测试应用 DDR介绍 DDR3 已不是当今主流的 DDR 存储器&#xff0c;市场上的 …

双天线+ins

使用1&#xff1a; 1、初始v-b 双天线与车固连且平行&#xff0c;双天线的欧拉角得到Cvn, Cnb组合得到&#xff0c;车体与INS之间不平行存在Cvb, 用Cnb*Cvn 得到Cvb initmisali(opt,solbuf,posebuf,ts,te,Cvb)) { 存疑的地方&#xff1a;att 应该清空后再用 否则变成了(A…

TMStarget学习——T1 Segmentation数据处理及解bug

最新学习季公俊老师的神器 TMStarget 的第一个模块基于结构像的靶区计算T1 segmentation。下面上步骤&#xff1a; (1)在github 上下载 TMStarget https://github.com/jigongjun/Neuroimaging-and-Neuromodulation (2)按照要求下载依赖工具软件AFQ、vistasoft、SPM12 &#…

GBase8c主备版500升级步骤

# 升级方式区别 就地升级&#xff1a;升级期间需停止业务进行&#xff0c;一次性升级所有节点。 灰度升级&#xff1a;灰度升级支持全业务操作&#xff0c;也是一次性升级所有节点。 指定节点升级&#xff1a;基于灰度升级&#xff0c;支持升级指定节点&#xff0c;支持部分…