jdk 16中改进的ZGC

2023-11-11

内存对象重定位的优化

预留堆空间(heap reserve)是堆空间中特殊的一块小空间,无法用于java线程的常规分配;而当发生gc时需要进行对象重分配时才会使用,此举确保了空的堆区域可用,即使是在java线程角度看堆空间已满,仍可进行对象的重分配操作;
在这里插入图片描述

缺点:1、只可在发生gc且对象重新分配时才会被使用,并且不能保证重分配操作能否正常完成,虽然正常情况下这种问题不会发生;
2、虽然预留空间只占用较小的空间,但是毕竟还是对原堆空间的占用,进而导致可用的堆空间变小且该空间在系统大部分负载情况下不被使用;

释放连续内存块的另一种方式就是在堆中直接进行压缩,hotspot中g1收集器在执行full gc时会在堆中直接压缩,该种方法的好处就在于不需要额外的内存来释放其他内存;
在这里插入图片描述

存在的缺点:1、对象需要顺序移动,否则就有可能覆盖尚未移动的对象,同时需要额外开销来协调多个gc线程的同步,这种情况就不适合并行处理;这样同时还会限制java的gc线程在对象重分配时可以的操作;

综上两种算法各有优劣,在预留堆空间充足的情况下,不进行原地对象重分配通常性能表现会更好;反之在预留堆空间不足时,原地对象重分配也能够保证对象分配完成;

故而从jdk 16开始,zgc兼顾两种算法的优势,可灵活在两种模式当中进行切换;此举也摆脱了对预留堆空间的需求,同时在常见情况下保持了良好的对象重分配的性能且能成功进行分配;
在默认情况下,当预留空间足够时,zgc就不会进行原地重分配;反之zgc将切换到原地重分配,一旦预留空间足够时,zgc将会再次切换到预留堆空间的模式;
not-in-place
in-place

这些重定位模式之间的来回切换时无缝进行的,如果有需要可以在同一gc周期中多次进行;但是大多数工作负载永远不会遇到需要切换的情况;

zgc的日志记录也进了扩展,以显示每个组(Small/Medium/Large)的堆区域(ZPages)重分配的信息;以下为一个示例,表示需要重新分配54M的小对象,需要原地重分配3个小页面:

GC(15) Small Pages: 120 / 240M, Empty: 0M, Relocated: 54M, In-Place: 3
GC(15) Medium Pages: 2 / 64M, Empty: 0M, Relocated: 0M, In-Place: 0
GC(15) Large Pages: 1 / 4M, Empty: 0M, Relocated: 0M, In-Place: 0

转发表的分配及初始化的优化

当zgc重定位对象时,对象的新地址记录在转发表中,转发表是在java堆之外分配的数据结构;每个堆区域被选择为重定位集(压缩以释放内存的堆区域的集合)的一部分且都将获得与之关联的转发表;
在jdk16之前,当重定位集非常大时转发表的分配和初始化可能会占用整个gc周期时间的很大一部分;重定位集的大小与在重定位期间移动的对象数相关;假如存在一个大于100GB的堆并且因工作负载导致大量碎片,如果这些碎片均匀分布在整个堆中,那么重定位集将很大且在分配/初始化阶段会需要一段时间;因为这项工作总是在并发阶段完成,因此它从未影响过GC的暂停时间,不过这里依然存在改进的空间;
在jdk16中,zgc现在批量分配转发表;如今我们不再需要大量触发malloc/new调用(可能数以千计)来为每个转发表分配内存,转而一次调用以分配所有表所需的所有内存;此举有助于避免通常的分配开销和潜在的锁竞争并显著减少分配这些表所需的时间;
这些表的初始化是另一个瓶颈;转发表是一个哈希表,因此初始化它意味着设置一个较小的标头,并将转发表项的数组(可能很大)清零;从jdk16开始zgc使用多个线程而不是单个线程并行进行初始化;

以上这些更改大大减少了分配和初始化转发表所需的时间,尤其是在收集非常稀疏、非常大的堆时时间上可以缩短一到两个数量级;

在这里插入图片描述

原文链接: https://malloc.se/blog/zgc-jdk16

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jdk 16中改进的ZGC 的相关文章

  • 如果您不在 Java 中进行克隆,那么您会做什么以及如何称呼它?

    有没有人对 Java 中的复制构造函数 工厂方法等有任何建议或已建立的最佳实践和命名约定 特别是 假设我有一堂课Thing我想要一个返回新值的方法Thing与 a 具有相同的值Thing传入 如果是实例方法 则作为实例 您会将其作为构造函数
  • 将处理项目移至 Eclipse

    我已经在处理项目上工作了一段时间 现在想将其移至 Eclipse 中 我已经在 Eclipse 环境中安装了 Proclipse 我有很多扩展名为 pde 的文件 然而 Proclipse 文件都以 java 结尾 所有 pde 文件都存在
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • 未注入带有 JPA2 的 Apache Ignite 2.7 IgniteRepository

    使用在 Web 上建立的 guildes 我使用 Spring Data JPA 2 应用程序制作了简单的 Spring Boot 2 仅在 2 7 版本中才向 Apache Ignite 添加了 Spring Boot JPA 2 支持
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • Java 中如何验证字符串的格式是否正确

    我目前正在用 Java 编写一个验证方法来检查字符串是否是要更改为日期的几种不同格式之一 我希望它接受的格式如下 MM DD YY M DD YY MM D YY 和 M D YY 我正在测试第一种格式 每次它都告诉我它无效 即使我输入了有
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 在Java中如何将字节数组转换为十六进制?

    我有一个字节数组 我希望该数组的每个字节字符串转换为其相应的十六进制值 Java中有没有将字节数组转换为十六进制的函数 byte bytes 1 0 1 2 3 StringBuilder sb new StringBuilder for
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • jDBI中如何进行内查询?

    我怎样才能在 jDBI 中执行这样的事情 SqlQuery select id from foo where name in
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 无法连接到docker中的elasticsearch容器

    我正在尝试使用 docker 的官方 elasticsearch 镜像 我遵循了本指南 https www elastic co guide en elasticsearch reference current docker html但是当
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • 从 InputStream 中删除换行符

    我喜欢从一个文件中删除所有换行符 对于 n 和 r n java io InputStream 在读取文件时 相应的方法如下所示 param target linkplain File return linkplain InputStrea
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We
  • 如何使用socket.io发送图像文件(二进制数据)?

    我无法从以下位置发送数据Android Client to NodeJS Server I use Socket IO 客户端 https github com socketio socket io client java我的客户端中的ja

随机推荐

  • 微信支付JSAPI支付

    公司业务需求 在公众号中加入微信支付和支付宝支付 效果图如下 菜单的设计直接在公众号中设置就好啦 两个子菜单都是跳转网页形式直接把你服务器上的url复制上就好 一些其他的很重要的配置 微信支付中开发配置 支付测试url 这里是报错 开始以为
  • 记一次centos7 下根目录扩容操作(步骤详细!!!)

    文章目录 需求描述 具体步骤 查看本机磁盘环境 添加磁盘分区 开始扩容 同步到文件系统 参考内容 需求描述 由于测试环境需要 虚拟机根目录需要扩容至120G 具体步骤 查看本机磁盘环境 root localhost df h 文件系统 容量
  • linux中copy_to_user()和copy_from_user()函数

    由于内核空间与用户空间的内存不能直接互访 因此借助函数 copy from user 完成用户空间到内核空间的复制 函数copy to user 完成内核空间到用户空间的复制 copy from user 和 copy to user 的原
  • 从第一人称的角度去带你了解Shell脚本的编写过程及思路

    前言 最近有朋友拿了两个文本给我 里面全都是IP地址 第一个IP地址是已安装相关服务的主机地址 第二个地址则是某一区域的所有主机IP地址 其中第一个文本有部分内容与第二个文本的内容重复 说明是已经安装了的 而第一个文本除了包含第二个文本的部
  • 单节锂电池充放电及外部供电自动切换的电路--原理介绍

    目录 单节锂电池充放电及外部供电自动切换的电路 原理介绍 1 电源输入与输出 2 虚线左边的电路是充电电路 3 虚线右侧的电路是自动切换电路 4 元器件的选择 5 PCB设计建议 单节锂电池充放电及外部供电自动切换的电路 原理介绍 介绍一种
  • 利用matlab建立一个压缩机的热力学数学模型,给出具体的代码

    我不太懂你在说什么 但是我可以提供一些参考资料 可以帮助你建立压缩机的热力学数学模型 1 MATLAB编程指南 https www mathworks com help matlab programming guide html 2 MAT
  • WSL2 在 Windows10下的 网卡 配置问题

    网络上的大部分解决方案是 在Hyper V 的WSL的虚拟交换机中的连接类型改成外部网络 然后在用户目录 USERPROFILE 下面创建一个配置文件 wslconfig wsl2 networkingMode bridged 桥接模式 v
  • CTFHub-web(cookie注入)

    文章目录 一 解题步骤 二 关于sql中 id 多少 的说明 一 解题步骤 1 题目为cookie注入 我们首先先看一下cookie里的值有没有什么可以帮助我们思考的东西 id 1 很明显存在sql注入 2 我们抓包来一步步的进行注入会更方
  • .Net Core跨域处理

    查看官方文档 https docs microsoft com zh cn aspnet core security cors view aspnetcore 2 2 分两部分处理跨域 ConfigureServices里添加 servic
  • 【华为OD机试】模拟消息队列【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 让我们来模拟一个消息队列的运作 有一个发布者和若干消费者 发布者会在给定的时刻向消息队列发送消息若此时消息队列有消费者订阅 这个消息会被发送到订阅的消费者中优先级最高
  • awk的数组学习心得

    http bbs chinaunix net thread 2312439 1 2 html 在文本处理的工作中 awk的数组是必不可少的工具 在这里 同样以总结经验和教训的方式和大家分享下我的一些学习心得 如有错误的地方 请大家指正和补充
  • 医学图像语义分割最佳方法的全面比较:UNet和UNet++

    点击上方 AI公园 关注公众号 选择加 星标 或 置顶 作者 Sergey Kolchenko 编译 ronghuaiyang 导读 在不同的任务上对比了UNet和UNet 以及使用不同的预训练编码器的效果 介绍 语义分割是计算机视觉的一个
  • 超好用的数学公式识别软件mathpix!

    在写科研论文或者其他论文 亦或者将word里的公式搬到latex里进行排版 数学公式总是一项非常艰巨的任务 在电脑上输入的速度远远没有手写来得快 既然如此 有没有办法直接识别手写的公式呢 有 就是这个软件 mathpix 怎么使用呢 下载安
  • Linux-RPM软件包管理/dnf管理软件/源码安装教程/使用systemd管理服务

    文章目录 管理软件包 RPM软件包 Linux软件包管理概述 RPM软件包管理 RPM软件包管理的优缺点 使用RPM命令管理软件 安装 查询 升级 卸载 RPM命令常用参数 RPM命令 安装 RPM命令 卸载 RPM命令 升级 RPM 查询
  • jdbc原理与步骤

    jdbc原理 1 加载JDBC驱动 并将其注册到DriverManager 2 建立数据库连接 获取connection对象 3 建立Statement对象或PreparedStatement对象 4 执行SQL语句 5 访问结果集Resu
  • 送本书《Python 之旅》

    在线阅读 下载 在线阅读 https www bookstack cn books explore python 下载 关注公众号马上码回复 pythonzl Python 是一门面向对象 解释型的高级程序设计语言 它的语法非常简洁 优雅
  • 分析游戏《明日方舟》的成功要素

    明日方舟 这个出身并不显赫 玩法也绝非时下主流的游戏一经上线 就在一个月内连续霸榜 在正式上线一个月的时候 顺理成章地登顶App Store畅销榜榜首 简单介绍游戏信息与核心玩法 游戏名称 明日方舟 英文名称 Arknights 制作厂商
  • element-ui el-tree树形控件 默认箭头更改

    这是基础性 那么怎么修改呢 很简单只需要在css中修改 注意 vue中修改需要添加 deep el icon arrow right color 49c0ff el table el table expand icon el icon ar
  • 秒杀多线程第十五篇 多线程十大经典案例之一 双线程读写队列数据

    秒杀多线程第十五篇 多线程十大经典案例之一 双线程读写队列数据 多线程十大经典案例之一双线程读写队列数据 案例描述 MFC对话框中一个按钮的响应函数实现两个功能 显示数据同时处理数据 因此开两个线程 一个线程显示数据 开了一个定时器 响应W
  • jdk 16中改进的ZGC

    内存对象重定位的优化 预留堆空间 heap reserve 是堆空间中特殊的一块小空间 无法用于java线程的常规分配 而当发生gc时需要进行对象重分配时才会使用 此举确保了空的堆区域可用 即使是在java线程角度看堆空间已满 仍可进行对象