ZGC收集器介绍

2023-11-01

ZGC收集器(-XX:+UseZGC)

        ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器,ZGC可以说源自于是Azul System公司开发的C4(Concurrent Continuously Compacting Collector) 收集器。


ZGC目标
如下图所示,ZGC的目标主要有4个:

  • 支持TB量级的堆。我们生产环境的硬盘还没有上TB呢,这应该可以满足未来十年内,所有JAVA应用的需求了吧。
  • 最大GC停顿时间不超10ms。目前一般线上环境运行良好的JAVA应用Minor GC停顿时间在10ms左右,Major GC一般都需要100ms以上(G1可以调节停顿时间,但是如果调的过低的话,反而会适得其反),之所以能做到这一点是因为它的停顿时间主要跟Root扫描有关,而Root数量和堆大小是没有任何关系的。
  • 奠定未来GC特性的基础
  • 最糟糕的情况下吞吐量会降低15%。这都不是事,停顿时间足够优秀。至于吞吐量,通过扩容分分钟解决。

        另外,Oracle官方提到了它最大的优点是:它的停顿时间不会随着堆的增大而增长!也就是说,几十G堆的停顿时间是10ms以下,几百G甚至上T堆的停顿时间也是10ms以下。

不分代(暂时)
        单代,即ZGC「没有分代」。我们知道以前的垃圾回收器之所以分代,是因为源于“「大部分对象朝生夕死」”的假设,事实上大部分系统的对象分配行为也确实符合这个假设。
那么为什么ZGC就不分代呢?因为分代实现起来麻烦,作者就先实现出一个比较简单可用的单代版本,后续会优化。


ZGC内存布局
        ZGC收集器是一款基于Region内存布局的, 暂时不设分代的, 使用了读屏障、 颜色指针等技术来实现可并发的标记-整理算法的, 以低延迟为首要目标的一款垃圾收集器。
ZGC的Region可以具有如图3-19所示的大、 中、 小三类容量:

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

NUMA-aware
NUMA对应的有UMA,UMA即Uniform Memory Access Architecture,NUMA就是Non Uniform Memory Access Architecture。UMA表示内存只有一块,所有CPU都去访问这一块内存,那么就会存在竞争问题(争夺内存总线访问权),有竞争就会有锁,有锁效率就会受到影响,而且CPU核心数越多,竞争就越激烈。NUMA的话每个CPU对应有一块内存,且这块内存在主板上离这个CPU是最近的,每个CPU优先访问这块内存,那效率自然就提高了:服务器的NUMA架构在中大型系统上一直非常盛行,也是高性能的解决方案,尤其在系统延迟方面表现都很优秀。ZGC是能自动感知NUMA架构并充分利用NUMA架构特性的。

ZGC触发时机
ZGC目前有4中机制触发GC:

  • 定时触发,默认为不使用,可通过ZCollectionInterval参数配置。
  • 预热触发,最多三次,在堆内存达到10%、20%、30%时触发,主要时统计GC时间,为其他GC机制使用。
  • 分配速率,基于正态分布统计,计算内存99.9%可能的最大分配速率,以及此速率下内存将要耗尽的时间点,在耗尽之前触发GC(耗尽时间 - 一次GC最大持续时间 - 一次GC检测周期时间)。
  • 主动触发,(默认开启,可通过ZProactive参数配置) 距上次GC堆内存增长10%,或超过5分钟时,对比距上次GC的间隔时间跟(49 * 一次GC的最大持续时间),超过则触发。

如何选择垃圾收集器

  1. 优先调整堆的大小让服务器自己来选择
  2. 如果内存小于100M,使用串行收集器
  3. 如果是单核,并且没有停顿时间的要求,串行或JVM自己选择
  4. 如果允许停顿时间超过1秒,选择并行或者JVM自己选
  5. 如果响应时间最重要,并且不能超过1秒,使用并发收集器
  6. 4G以下可以用parallel,4-8G可以用ParNew+CMS,8G以上可以用G1,几百G以上用ZGC

下图有连线的可以搭配使用


JDK 1.8默认使用 Parallel(年轻代和老年代都是)
JDK 1.9默认使用 G1 

安全点与安全区域

安全点就是指代码中一些特定的位置,当线程运行到这些位置时它的状态是确定的,这样JVM就可以安全的进行一些操作,比如GC等,所以GC不是想什么时候做就立即触发的,是需要等待所有线程运行到安全点后才能触发
这些特定的安全点位置主要有以下几种:

  1. 方法返回之前
  2. 调用某个方法之后
  3. 抛出异常的位置
  4. 循环的末尾

大体实现思想是当垃圾收集需要中断线程的时候, 不直接对线程操作, 仅仅简单地设置一个标志位, 各个线程执行过程时会不停地主动去轮询这个标志, 一旦发现中断标志为真时就自己在最近的安全点上主动中断挂起。 轮询标志的地方和安全点是重合的。
 

安全区域又是什么?
Safe Point 是对正在执行的线程设定的。如果一个线程处于 Sleep 或中断状态,它就不能响应 JVM 的中断请求,再运行到 Safe Point 上。因此 JVM 引入了 Safe Region。
Safe Region 是指在一段代码片段中,引用关系不会发生变化。在这个区域内的任意地方开始 GC 都是安全的。

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

ZGC收集器介绍 的相关文章

  • JVM 规范更新

    JVM 规范第 2 版的日期是 1999 年 自那时以来 我应该考虑学习哪些重要更新 如动态调用 这当然是为了了解现代 JVM 实现的内部原理 特别是 HotSpot 访问此链接http wikis sun com display HotS
  • Scala 泛型 - 为什么我无法在泛型类中创建参数化对象?

    我目前正在学习scala 为什么此代码不起作用 class GenClass T var d T var elems List T Nil def dosom x T var y new T y 我得到 错误 需要类类型 但找到了 T 代替
  • Jprofile可以连接到docker中运行的JVM

    我是 JProfiler 的新手 我最近遇到了一个问题 我的Java应用程序在docker中运行 这意味着JVM在docker中运行 但我的jprofile安装在主机上 我知道 jprofiler 必须连接到 JVM 那么 jprofile
  • 集群环境下的Spring Singleton

    正如中所讨论的this https stackoverflow com questions 1194129 singleton in cluster environmentpost 不适合使用单例聚集的环境 因为不同 JVM 中有多个单例对
  • 哪种语言(在 JVM 上运行)最适合创建 DSL?

    我们需要创建复杂的固定长度和可变长度字符串 这些字符串可能代表客户资料 订单等 你们建议使用哪种基于 JVM 的编程语言 想法是让最终用户使用此 DSL 创建字符串 所以我正在寻找验证 代码完成等 Groovy http docs code
  • 如何在JVM不退出的情况下多次运行Java程序?

    假设我有一个Java程序Test class 如果我使用下面的脚本 for i in 1 10 do java Test done JVM每次都会退出java Test被调用 我想要的是跑步java Test在不退出JVM的情况下多次执行
  • 最近有关于 JVM 的书吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • STS 无法在我的计算机上启动

    我试图在 eclipse 上设置 Spring mvc 项目 基本项目进展顺利 但是使用 Restful 服务 Jersey 等开始出现许多与依赖项相关的错误 所以我打算转到STS 我正在使用 STS 2 9 2 它给我 无法创建java虚
  • 非活动状态下的 Spring Boot 堆使用情况

    我在本地部署了一个非常简单的 spring boot 应用程序 它只有一个类 控制器 差不多就这样了 我注意到堆分配并不稳定 并且有峰值和突然下降 为什么会这样 我没有对应用程序进行过一次调用 A view from VisualVM 事实
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher
  • 如何在Java中计算对象的数字年龄[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道Java中对象的年龄 当我们使用new关键字时 Java中用户定义的对象被创建 但是什么时候它会被销毁 是跨越JVM的perm
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Java 语言中不可用的字节码功能

    当前 Java 6 是否有一些事情可以在 Java 字节码中完成而在 Java 语言中无法完成 我知道两者都是图灵完备的 所以将 可以做 理解为 可以做得更快 更好 或者只是以不同的方式 我正在考虑额外的字节码 例如invokedynami
  • jvm 次要版本与编译器次要版本

    当运行使用具有相同主要版本但次要版本高于 JVM 的 JDK 编译的类时 JVM 会抛出异常吗 JDK 版本并不重要 类文件格式版本 http blogs oracle com darcy entry source target class
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 为什么同样的算法在 Scala 中运行比在 C# 中慢得多?以及如何让它更快?

    该算法根据序列中每个成员的变体创建序列的所有可能变体 C 代码 static void Main string args var arg new List
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • Java:VM 如何在 32 位处理器上处理 64 位“long”

    JVM 如何在 32 位处理器上处理 64 位的原始 long 在多核 32 位机器上可以并行利用多个核心吗 64 位操作在 32 位机器上慢了多少 它可能使用多个核心来运行不同的线程 但不会并行使用它们进行 64 位计算 64 位长基本上

随机推荐

  • 在React项目中使用Redux实现计数器功能

    Redux 和 React 之间没有关系 Redux 支持 React Angular Ember jQuery 甚至纯 JavaScript 尽管如此 Redux 还是和 React 和 Deku 这类库搭配起来用最好 因为这类库允许你以
  • prompt范式

    1 范式发展历程 P1 非神经网络时代的完全监督学习 Fully Supervised Learning Non Neural Network 特征工程 P2 基于神经网络的完全监督学习 Fully Supervised Learning
  • 转置卷积(Transposed Convolution)

    目录 1 卷积操作及转置卷积的定义 1 1 卷积操作 1 2 转置卷积 1 3 转置卷积的步骤 2 转置卷积的理解 2 1 stride 1转置卷积的理解 2 1 1 一维形式 2 1 2 二维形式 2 1 3 公式计算 2 2 strid
  • 泛型使用时遇到的bug

    首先说 这次的bug理解起来很简单 就是泛型被使用时 泛型的类一定要被引用 前提说明 我建了一个保存预下单数据的接口 然后提供一个查询接口 我就想 每次查出来就是json 那每次都要代码里解析 太重复 为什么不做成泛型 查询时候把类型传入
  • 华农oj数据结构——8581

    8581 线性链表逆置 时间限制 1000MS 代码长度限制 10KB 提交次数 2811 通过次数 2032 题型 编程题 语言 G GCC Description 线性链表的基本操作如下 include
  • CTP 4097错误根源 / CTP程序运行没有反应/CTP版本说明

    其实这本是个很简单的错误 但经常看到有人问到 而且网上居然还出了玄学解答 所以干脆单独写一篇解释一下这个错误 这一篇文章同样适用于解决为什么没有OnFrontConnected回调 Decrypt handshake data failed
  • 记录一次 图片边缘色值问题

    texture wrap mode 设置为clamp
  • 你不知道的测试小技巧——postman接口测试导入导出操作详解

    目录 导出 导入 总结 postman中的集合脚本 环境变量 全局变量全部都可以导出 然后分享给团队成员 导出后的脚本可以通过newman生成测试报告 另外还可以将浏览器 抓包工具 接口文档 swagger 中的数据包导入到postman中
  • NeRF原理解析

    文章目录 引言 NeRF资料 技术基础梳理 算法概览 用神经辐射场 Neural Radiance Field 来表示场景 基于辐射场的体素渲染算法 经典体素渲染算法 数值近似的方法 优化神经辐射场 位置信息编码 Positional en
  • PyQt专题结题感言:Python图形用户界面开发

    PyQt专题结题感言 Python图形用户界面开发 在这篇文章中 我将为您介绍PyQt框架 这是一个功能强大的Python图形用户界面 GUI 开发工具 我将详细解释PyQt的基本概念和用法 并提供一些源代码示例来帮助您入门 PyQt是一个
  • 将两个有序数组合并为一个新的有序数组(Java实现)

    不可否认的是Java确实C语言方便许多 这种写法比我在C中的那种写法要好 代码如下 public class Test public static void main String args int arr1 1 3 5 7 9 int a
  • linux 删除的文件太多:bash:/usr/bin/rm: Argument list too long

    背景 删除一个文件夹内指定后缀的文件时 遇到错误 提示 bash usr bin rm Argument list too long 很明显是指定后缀的文件太多 导致无法删除 解决方案 通过命令find来进行删除 比如要删除所有的json文
  • 基于python+flask实现视频数据可视化

    使用爬虫对视频弹幕进行爬取并保存为csv文件 导入数据库中 进而实现前后端交互功能 数据集中包含的数据分别为爬取的热门视频的标题 播放量 弹幕量 收藏量 综合得分以及视频的类别等信息 便于后续我们进行数据分析 我们使用数据库中的数据评出综合
  • 任务分配的穷举法、匈牙利法、分支定界法

    1 必做 任务分配问题 设有 4 项任务 B1 B2 B3 B4 派 4 个人 A1 A2 A3 A4 去完成 每个人都可以承担 4 项任务中的任何一项 但所消耗的资金不同 设 Ai 完成 Bj 所需资金为 问如何分配任务 使总费用最少 假
  • 无缝漫游的过程!

    无缝漫游中无线AP的配置与普通无线AP的配置基本相同 只是应当注意以下几个方面的问题 所有无线AP必须使用同一SSID 所有无线AP必须使用同一网段的IP地址 并且处于同一VLAN中 信号相互覆盖的无线AP不能使用相同的频道 由于多个AP信
  • 图形分析之Nsight的使用

    作者 i dovelemon 日期 2017 06 11 来源 CSDN 主题 Nsight OpenGL 引言 最开始的时候 我进行图形编程使用的是DX 所以那时候进行图形分析的时候 基本都是使用PIX 后来转向了OpenGL 分析的时候
  • JVM-17(垃圾回收器)上

    目录 17 1 GC分类与性能指标 17 1 1 JVM的发展 17 1 2评估GC的性能指标 17 2 不同的垃圾回收器概述 17 3 Serial回收器 串行回收 17 4 ParNew回收器 并行回收 17 5 Parallel回收器
  • html超链接打开共享文件夹,教你如何访问共享文件夹

    现在我们往往要讲究 资源共享 就是有好的东西跟大家一起分享 那么到电脑上呢经常有一些文件夹 有的是加密的 有的是共享的 今天呢小编就要给大家讲讲如何访问这些共享文件夹 要想查看共享文件夹其实也是有步骤可言的 首先 要先打开控制面板 有一个W
  • 电脑开机就显示360服务器,我用360给电脑杀毒,一直到开机启动项会停止,显示“扫面服务意外终止,无法继续扫描,这可能是由于程序...

    希望我的回答可以帮助楼主解决问题哦 这个问题很明显是杀毒软件自身的问题 不太知道诺顿这款杀毒软件 是不是在升级过程中发生什么问题造成的 楼主可以尝试换用腾讯电脑管家 这款杀毒软件在病毒以及木马的查杀方面很权威 很成熟 下面是我总结的电脑容易
  • ZGC收集器介绍

    ZGC收集器 XX UseZGC ZGC是一款JDK 11中新加入的具有实验性质的低延迟垃圾收集器 ZGC可以说源自于是Azul System公司开发的C4 Concurrent Continuously Compacting Collec