JVM — JDK11垃圾回收器 ZGC

news2024/11/22 4:37:44

1. ZGC介绍

ZGC(The Z Garbage Collector)是 JDK 11 中推出的一款低延迟垃圾回收器,为实现以下几个目标而诞生的垃圾回收器,停顿时间不超过 10ms,停顿时间不会因堆变大而变长,支持 8MB~4TB 级别的堆(未来支持 16TB)

2. ZGC内存和原理

2.1 ZGC内存分布

ZGC 与传统的 CMS、G1 不同、它没有分代的概念,只有类似 G1 的 Region 概率;在划分内存的方式上,ZGC 与 G1 有着相似的地方,都舍弃了年轻代、老年代的划分方式,但是又与 G1 的形式不太一样,ZGC 是页为单位进行划分,一般分为三种页面:

  • 小型 Region(Small Region):容量固定为 2MB,用于放置小于 256KB 的小对象。
  • 中型 Region(Medium Region):容量固定为 32MB,用于放置大于 256KB 但是小于 4MB 的对象。
  • 大型 Region(Large Region):容量不固定,可以动态变化,但必须为 2MB 的整数倍,用于放置 4MB 或以上的大对象。每个大型 Region 中会存放一个大对象,这也预示着虽然名字叫 “大型 Region”,但它的实际容量完全有可能小于中型 Region,最小容量可低至 4MB。大型 Region 在 ZGC 的实现中是不会被重分配的(重分配是 ZGC 的一种处理动作,用于复制对象的收集器阶段)因为复制大对象的代价非常高。
    在这里插入图片描述

2.2 ZGC 原理

全并发的 ZGC垃圾回收流程: 与 CMS 中的 ParNew 和 G1 类似,ZGC 也采用标记 - 复制算法,不过 ZGC 对该算法做了重大改进:ZGC 在标记、转移和重定位阶段几乎都是并发的,这是 ZGC 实现停顿时间小于 10ms 目标的最关键原因。

ZGC 垃圾回收周期如下图所示:
在这里插入图片描述
ZGC 只有三个 STW 阶段:初始标记,再标记,初始转移
初始标记和初始转移分别都只需要扫描所有 GC Roots,其处理时间和 GC Roots 的数量成正比,一般情况耗时非常短;再标记阶段 STW 时间很短,最多 1ms,超过 1ms 则再次进入并发标记阶段。即,ZGC 几乎所有暂停都只依赖于 GC Roots 集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与 ZGC 对比,G1 的转移阶段完全 STW 的,且停顿时间随存活对象的大小增加而增加。

3. ZGC技术特性

3.1 着色指针

着色指针(Colored Pointers)是 ZGC 的关键技术。ZGC 之前的垃圾回收器 JVM 将对象的 GC 信息记录在对象头 Mark Word 中,GC 进行标记的时候遍历 GC Roots 的对象然后对 Mark Word 的信息进行修改。而 ZGC 将 GC 信息记录在指针中,标记算法不再寻找 Mark Word 中的信息,只需要找到相应的指针信息即可。
在 64 位架构的计算机中(ZGC 只支持 64 位), 一个 Java 对象 64 位,其中低位的 42 位是对象地址,42-45 位用来做标记信息,四个状态分别是 Marked0、Marked1、Remapped、Finalizable,剩下的 18 位预留以后使用。
创建对象时,JVM 先在堆空间申请一个内存地址,同时利用 MMAP 函数将该内存地址分别映射到 Marked0、Marked1,Remapped 完成多视图映射。在同一时间这三个视图有且仅有一个生效,这是一种 “空间换时间” 的思想。
在这里插入图片描述

3.2 读屏障

读屏障主要是用来解决指针在并行转移的过程中出现的问题。ZGC 进行并行转移时,GC 线程与 Java 应用线程同时工作,当 Java 应用线程读取一个未完成转移的对象的时候就会出现指针无效的问题。为了解决这个问题 ZGC 使用了读屏障的技术,当出现上述情况的时候,Java 应用线程必须在读取对象之前先把对象转移。同时 ZGC 设置了触发条件,只有在应用线程从内存堆中加载对象引用的情况下才会触发读屏障。读屏障根据着色指针记录的 GC 信息判断对象是否被移动过,如果对象发生过移动就需要对指针的内存地址进行修复。读屏障的触发条件可参考以下代码:

Object object = obj.FieldA ; // 从堆中读取对象引用,需要加入读屏障

Object o = object ;          // 不需要加入读屏障,因为不是从堆中读取引用

object.doSomething ();        // 不需要加入读屏障,因为不是从堆中读取引用

int i = obj.FieldB;          // 不需要加入读屏障,因为不是对象引用

ZGC 中读屏障的代码作用:

GC 线程和应用线程是并发执行的,所以存在应用线程去 A 对象内部的引用所指向的对象 B 的时候,这个对象 B 正在被 GC 线程移动或者其他操作,加上读屏障之后,应用线程会去探测对象 B 是否被 GC 线程操作,然后等待操作完成再读取对象,确保数据的准确性。具体的探测和操作步骤如下:
在这里插入图片描述

4 总结

ZGC 作为下一代垃圾回收器,性能非常优秀。ZGC 垃圾回收过程几乎全部是并发,实际 STW 停顿时间极短,不到 10ms。这得益于其采用的着色指针和读屏障技术。

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

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

相关文章

【专题速递】MD-VQA、AB实验、音视频质量建设以及在手机上的应用

// 怎样才能更好地进行QoE优化?音视频技术在用户侧的挑战又是什么?7月29日LiveVideoStackCon上海站QoE与数据驱动专场,为您解答。 QoE与数据驱动 在音视频应用里,获得了大量的用户上报数据,包括但不限于音视频质量数…

ASM汇编语言环境安装

以前是学习过8位单片机的,忘记的差不多了。现在需要使用64位的汇编语言,准备重新学习。 64位的编程环境使用ebe,sf上有的下载: 这个软件不错,可以调试64位的汇编语言,寄存器也可以实时查看。 32位的编程开…

pcl经典算法60例——(1)打开并显示点云,窗口PCLVisualizer嵌入MFC的picture control

一、搭建MFC框架 1、环境说明 本教程为vs2022,pcl1.12.1版本,其他版本自己进行适当修改,仅供参考。 2、方法步骤 (1)新建项目,选择“基于对话框”,然后点击“下一步” 二、配置pcl环境 关于配置环境,网…

centos安装常见软件

安装git # 方式一:yum install git -y# 方式二:(开发会用的软件)yum -y groupinstall "Development tools"# 执行下面这条yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel…

点云实战及Python路径实验

点云实战 文章目录 点云实战python 有关路径实验下一级目录上一级目录 学习PointNet论文(https://arxiv.org/abs/1612.00593)并实践 python .\show_seg.py --dataset ../data/shapenet --model .\seg\seg_model_Chair_2.pth python 有关路径实验 下一级…

kotlin Flow系列之 - 冷流SafefFlow源码解析之 - Safe在那里?

本文涉及源码基于kotlinx-coroutines-core-jvm:1.7.1 kotlin 协成系列文章: 你真的了解kotlin中协程的suspendCoroutine原理吗? Kotlin Channel系列(一)之读懂Channel每一行源码 kotlin Flow系列之-SharedFlow源码解析 kotlin Flow系列之-StateFlow源码…

【java】隐藏手机号中间四位

String phone "12334543437";phone phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");System.out.println(phone);

Mycat【什么是Mycat、Mycat与其他中间件区别、Mycat应用场景、核心概念详解、Mycat原理】(一)-全面详解(学习总结---从入门到深化)

目录 Mycat概述_什么是Mycat Mycat概述_Mycat与其他中间件区别 Mycat概述_Mycat应用场景 Mycat概念_核心概念详解 Mycat概述_Mycat原理 Mycat部署安装_MySQL主从复制概述 Mycat概述_什么是Mycat 什么是Mycat Mycat是数据库中间件,所谓中间件数据库中间件是连…

CentOS详细安装教程

文章目录 前言一、下载所需版本的 CentOS二、创建虚拟机三、安装 CentOS 前言 本文在虚拟机上安装 CentOS Linux release 7.6.1810 版本的操作系统,仅作为安装记录。 一、下载所需版本的 CentOS 1、进入 CentOS 官网:https://www.centos.org/download/…

React类组件

1. React组件 将页面按照界面功能进行拆分,每一块界面都拥有自己的独立逻辑,这样可以提高项目代码的可维护性。其中React组件分为两种,一种是类式组件,一种是函数式组件。这里我们将的是比较常用的类式组件,但是在后续…

《安全软件开发框架(SSDF) 1.1:降低软件漏洞风险的建议》解读(六)

安全软件开发框架SSDF是由美国国家标准与技术研究院发布的关于安全软件开发的一组实践,帮助开发组织减少发布的软件中的漏洞数量,减少利用未检测到或未解决的漏洞的潜在影响,从根本上解决漏洞防止再次发生。本文根据《Secure Software Develo…

dedecms后台数据库备份迁移流程

dedecms网站正常使用需要两部分,网站文件和数据库.两者缺一不可. dedecms上传网站文件后,还要导入数据库,如果您只有网站后台备份,没有其他格式sql备份文件,请按照下面流程重装dedecms,并操作恢复数据库 . 需要选确定/wwwroot/data/backupdata/下是否有对应备份 如不存在备份…

机器学习面试题 - 模型评估2

目录标题 8、为什么在一些场景中要使用余弦相似度而不是欧氏距离?9、余弦距离是否是一个严格定义的距离?10、在对模型进行过充分的离线评估之后,为什么还要进行在线A/B测试?11、如何进行线上A/B测试?12、如何划分实验组和对照组1…

ChatGPT落地场景探索-数据库与大模型

目录 openGauss介绍 openGauss介绍 数据库与大模型 openGauss介绍 大模型与数据库 大模型为数据库带来的机遇 大模型解决数据库问题的挑战 数据库为大模型带来的价值 大模型大模型的发展趋势 趋势产品:Chat2DB 简介 特性 生产应用:基…

运输层:TCP超时重传时间的选择

1.运输层&#xff1a;TCP超时重传时间的选择 笔记来源&#xff1a; 湖科大教书匠&#xff1a;TCP超时重传时间的选择 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 若将超时重传时间RTO < \lt < 报文段0的往返时间RTT0&#xff0c;则会出现…

ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、农业、大气等领域数据分析

查看原文>>> ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、农业、大气等领域数据分析 【内容简述】&#xff1a; 注&#xff1a;请提前自行配置上课环境 【其它相关推荐】&#xff1a; GEE遥感云大数据林业应用典型案例实践及GPT模型应用 基…

【Ubuntu】apt 更换阿里源

Ubuntu apt 更换阿里源 1.Ubuntu apt 更换阿里源1.1 找到阿里官方相关镜像1.2 找到apt的源管理文件1.3 使用命令替换其源地址1.4 刷新源信息1.5 Failed to fetch http://xxxxxxx Temporary failure resolving ‘mirrors.aliyun.com‘ 1.Ubuntu apt 更换阿里源 1.1 找到阿里官方…

Java 设计模式 随笔1 监听器/观察者

0. 不由自主&#xff0c;恍恍惚惚&#xff0c;又走回头路&#xff0c;再看一眼有过的幸福… 太棒了流沙!!! 0.1 引用 https://blog.csdn.net/majunzhu/article/details/100869562 ApplicationEvent事件机制源码分析 单机环境下优雅地使用事件驱动进行代码解耦 1. JDK 1.1 …

LAXCUS分布式操作系统总体概述

本文回答用户问的一些情况&#xff0c;因为问题主要集中LAXCUS分布式操作系统的产品、市场、发展层面&#xff0c;技术问题倒是不多&#xff0c;我在这里做个总体概述的回答吧。 LAXCUS分布式操作系统是基于分布式运行环境构建的【数存算管】超融合一体化平台&#xff0c;处理…

Excel 合并单元格筛选时只出现首行

一、问题描述 如果对合并单元格直接筛选&#xff0c;只能筛选出第一个单元格的值 二、原因分析&#xff1a; Excel筛选单元格时&#xff0c;遇到不连续区域&#xff08;即中间有空白单元格&#xff09;会识别不到后续内容&#xff1b; 合并单元格后&#xff0c; 除首行外&…