ZGC垃圾收集器-JVM(十五)

2023-11-10

上篇文章说了G1的特性,无分代,复制算法,大内存就可以用G1,可预测stw时间等特性。

G1垃圾收集分类-JVM(十四)

  • ZGC收集器

-XX:+UseZGC

ZGC(Z Garbage Collector)是在jdk11新加入的低延迟垃圾收集器。

Zgc有四个目标

  1. 支持至少TB级别堆内存回收。(目前4TB)
  2. STW保持在10ms之内。
  3. 吞吐量稍微降低,不会降低超过百分之15
  4. 奠定未来GC收集器的基础。

Oracle官方介绍,不会因为内存的增大而增大,意味着几十G的堆,gc停顿时间不会超过10ms。

Zgc暂时没有分代,因为内部算法太复杂,实现分代太麻烦,暂时用单代版本,后续会优化,可能就支持更高的TB内存服务器。

NUMA-aware

UMA(Uniform Memory Access Architecture)表示内存只有一块,所有CPU都在这块内存运行,那么就存在竞争关系,争夺内存的访问权,有竞争就有锁,必然影响效率,CPU内核越多则竞争越激烈。所以与之而来,有了NUMA(Non Uniform Memory Access Architecture)直接每个CPU对应独有的内存块,且在主板上,这个CPU离对应的内存块是最近的,自然性能很高。

  • ZGC运作过程

运作过程大致分为四个阶段,并发标记,并发预配重分配,并发重分配,并发重映射

  1. 并发标记(Concurrent Mark):与G1一样,可达性算法从GC roots遍历,初始标记(mark start)和最终标记(mark end)也会出现短暂停顿,与G1不同的是遍历的不是对象,而是指针,标记阶段会更新指针颜色

(cms和g1有三色标记,在对象头里,但是zgc的并发标记跟对象没关系,而是放在内存存储空间的指针上)

2、并发预备重分配(Concurrent Prepare for Relocate):这个阶段需要根据特定条件统计本次收集过程需要清理哪些region,将这些region组成重分配集(Relocation Set)。ZGC每次回收都会扫描所有的region,用范围更大的扫描成本换省去G1记忆集的成本。

3、并发重分配(Councurrent Relocate):重分配是ZGC核心阶段,这个过程要把重分配存活对象复制到新的region,并为重分配集的每个region维护一个转发表(Forward table),记录旧对象到新对象转换关系。Zgc收集器仅从引用就能知道对象是否处于重分配中,如果用户线程此时访问了重分配对象,这次访问会被预置的内存屏障(读屏障)所截获,然后根据region上转发表到新复制对象上,并同时修正该引用值,使其直接指向新对象,zgc这种行为称为指针的“自愈”能力。

4、并发重映射(Coucurrent Remp):重映射所做的就是修正整个堆中指向重分配集旧对象所有引用,但是ZGC自愈功能,所以这个重映射不是很迫切。ZGC巧妙的把重映射要做的工作,合并到下一次垃圾收集器循环并发标记阶段去完成,反正他要遍历所有对象,这样就可以节省开销。一旦所有指针被修正,原来记录新旧关系的转发表也可以释放。

  • 颜色指针

Coloored Pointers,颜色指针。

64位处理器,只需要42位来寻址,2^42则是4TB。后面版本jdk改为44位寻址,2^44则就是16TB。

另外四位做标记,比如marked1、marked0、finalizable标识和remapped标识。

Finalizable:就是三色标记,但不限于三种颜色,此位并发处理,表示对象通过此访问。

Remapped:对象未指向relocation set中,relocation set表示需要gc的region集合。

剩余18位还未使用,预留给以后使用。

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

ZGC垃圾收集器-JVM(十五) 的相关文章

  • 在正在运行的 JVM 中查找正在运行的实例

    我想知道是否可以获取给定类的正在运行的实例的句柄 触发此问题的特定问题是应用程序由于存在大量正在运行的线程而无法正常退出 是的 我知道您可以对 thead 进行守护进程 然后它们就不会阻止应用程序退出 但这确实让我想知道这是否可能 我能做的
  • Java:为什么它使用固定数量的内存?或者它如何管理内存?

    JVM 似乎使用了一些固定数量的内存 至少我经常看到参数 Xmx 对于最大尺寸 和 Xms 对于初始大小 这表明 我感觉 Java 应用程序不能很好地处理内存 我注意到一些事情 即使一些非常小的示例演示应用程序也会加载大量内存 也许这是因为
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 无法为对象堆保留足够的空间

    每次尝试运行该程序时 我都会重复出现以下异常 VM初始化期间发生错误 无法为对象堆保留足够的空间 无法创建Java虚拟机 我尝试增加虚拟内存 页面大小 和 RAM 大小 但无济于事 我怎样才能消除这个错误 运行 JVM XX MaxHeap
  • 使用 Coldfusion 11 的 CFdirectory,文件名中存在非 ASCII 字符问题

    我有一个类似的问题 ColdFusion CFDirectory 和法语 https stackoverflow com questions 1715632 coldfusion cfdirectory and the french从而没有
  • 将 Kotlin .kt 类打包到 JAR 中

    我如何构建HelloWorld kt as a JAR以便它运行 thufir dur kotlin thufir dur kotlin kotlinc HelloWorld kt include runtime d HelloWorld
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • 了解 Sun JVM [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么Java编译器复制finally会阻塞?

    当使用简单的代码编译以下代码时try finally块中 Java 编译器产生以下输出 在 ASM 字节码查看器中查看 Code try System out println Attempting to divide by zero Sys
  • 从 Java 内部限制 CPU

    我在这个 和其他 论坛中看到了许多具有相同标题的问题 但似乎没有一个问题能完全解决我的问题 就是这个 我有一个 JVM 它占用了托管它的机器上的所有 CPU 我想限制它 但是我不能依赖任何限制工具 技术external到 Java 因为我无
  • Java 8:为什么元空间大小增加但加载的类数量保持不变?

    在 Jdk 8 上运行的应用程序中 我们使用 VisualVM 来跟踪加载的类的使用情况和元空间的使用情况 在我们的应用程序运行时的某个时间点 我们看到加载的类的数量不再增加 但元空间的大小在程序运行时仍然增加 那么除了类之外 还有什么东西
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • 运行具有外部依赖项的 Scala 脚本

    我在 Users joe scala lib 下有以下 jar commons codec 1 4 jar httpclient 4 1 1 jar httpcore 4 1 jar commons logging 1 1 1 jar ht
  • PS幸存者空间几乎已满

    我看到我的应用程序的 PS 幸存者空间在大部分时间几乎已满 98 我不知道PS幸存者空间是什么 这是正常的吗 遇到这种情况应该怎么办 首先 参见例如这里 什么是幸存者空间 https stackoverflow com q 10695298
  • JVM是编译器还是解释器?

    我有一个关于 JVM 的非常基本的问题 它是编译器还是解释器 如果是解释器 那么JVM内部存在的JIT编译器呢 如果两者都不是 那么 JVM 到底是什么 我不想要jVM的将字节代码转换为机器特定代码等的基本定义 首先 让我们清楚地了解以下术
  • PermGen 和 Heap,区别及其意义

    Friends 您能告诉我堆和永久代的意义 区别和用途吗 另外 最好知道它们分别加载了什么类 与 Java VM 规范相关的解释非常有帮助 谢谢 普尼斯 内存 堆 是分代管理的 或者说是保存不同年龄对象的内存池 当这一代填满时 每一代都会发
  • 为什么在Java中读取易失性和写入字段成员是不可扩展的?

    观察以下用 Java 编写的程序 完整的可运行版本如下 但程序的重要部分在下面的代码片段中 import java util ArrayList A not easy to explain benchmark class MultiVola

随机推荐

  • 实测最像ChatGPT的中文产品:能解释三体、懂弱智吧的梗,内测开启人人都能试!...

    明敏 发自 凹非寺量子位 公众号 QbitAI 最像ChatGPT的中文产品 出现了 昨晚 一个名叫Inspo的生成式对话AI 刚刚在 民间 开启内测 马上引发不小反响 体验过的博主表示 1分钟搞定3份策划 工作5年没它能写 有人自己上手试
  • IP数据报检验和计算

    在进行计算之前先补充一下基础知识 一 原码 反码和补码 原码 原码是计算机机器数中最简单的一种形式 数值位就是真值的绝对值 符号位位 0 时表示正数 符号位为 1 时表示负数 原码又称带符号的绝对值 为了方便整数和小数区别 整数的符号位与数
  • Android 实现按钮 跳转到某网页

    这个是我在刚开始学习Android的时候 我同学要做一个手机端的控制 他说我的东西都用 java web写好了 你只要给我写一个跳转按钮即可 其实很简单只是简单地按钮点击事件和Intent跳转 但是毕竟是第一次帮别人做东西还觉得挺有意义的
  • YouTube深度学习视频推荐系统

    YouTube推荐系统架构 YouTube推荐系统架构是经典的两级模型 召回 精排模型 第一级用候选集生成模型完成候选视频的快速筛选 在这一步 候选视频集合由百万量级降至几百量级 这相当于经典推荐系统架构中的召回层 第二级用排序模型 Ran
  • 【mac】iTerm2中ssh保持连接不断开

    1 概述 转载 http bluebiu com blog iterm2 ssh session idle html 一 一个iTerm2蛋疼的问题 最近基友搞了台mbp 在装一些常用app时 跟我交流到一个情况 用iTerm2进行ssh时
  • 树莓派串口调试助手minicom的简单使用

    安装 minicom sudo apt get install minicom 启动minicom minicom D dev ttyAMA0 minicom 默认波特率为115200 D 代表端口 b 设置波特率参数 例如 b 9600
  • 网络调试工具TCP/UDP socket的使用

    TCP UDP socket调试工具的使用 可以在想服务器发送命令 或者查看服务器返回的数据 打开界面后选择左边客户端还是服务端 使用TCP还是udp 点击创建相应的模拟环境
  • docker 容器满了常用处理方法

    docker 容器满了常用处理方法 1 运行 df h 查看剩余磁盘占用情况 2 进入到docker目录 cd var lib docker 3 运行du h max depth 1 检索文件的最大深度1 即只检索汇总计算当前目录下的文件
  • Oracle用function生成UUID方法

    CREATE OR REPLACE FUNCTION get uuidRETURN VARCHARISguid VARCHAR 50 BEGINguid lower RAWTOHEX sys guid RETURNsubstr guid 1
  • 移动端/帆软移动报表调用拨打电话

    HTML a标签的href 属性 tel 点击可以直接拨打电话 移动端 a href 13622178579 a 把某个单元格 形态赋值为 公式形态 a href style color 508ef9 a ps F1列存储电话号码
  • 自动化运维脚本语言shell练习(2)

    1 编写脚本for1 sh 使用for循环创建20账户 账户名前缀由用户从键盘输入 账户初始密码由用户输入 例如 test1 test2 test3 test10 2 编写脚本for2 sh 使用for循环 通过ping命令测试网段的主机连
  • 程序员,你今年读了几本书?

    调查显示 国人去年平均阅读 4 本书 程序员不应该只有 代码大全 4 23 世界读书日 GitChat 码农读书日 活动最后 1 天 用抄底的价格 抢你要的技术书 GitChat 特意筛选畅销度最高的品种 给予超大力度的优惠 深度学习入门
  • 如何关闭FileZilla Server开机自启

    FileZilla Server开机自启 有些软件开机自启 个人感觉是比较反感的 像流氓一样 如何关闭 选中此电脑 gt 右键单击 gt 点击管理 找到之后FileZilla Server FTP server之后右键点击属性 改成手动启动
  • 重t2加权是什么意思_王者荣耀中说的T0、T1,到底是啥意思?这下总算清楚了

    王者荣耀这款游戏可以说是相当火了 玩这款游戏的人应该有3亿左右了吧 而在这么庞大的人群中 也孕育出一种独特的语言 甚至有些老玩家也是没有听说过得 就比如今天我们要聊的 在王者荣耀中说的TO T1到底是什么意思呢 今天就给大家科普一下 TO英
  • testflight测试的直播软件,怎么使用 TestFlight 测试 App,注意些什么?

    原标题 怎么使用 TestFlight 测试 App 注意些什么 TF签名是什么 TF签名全称为TestFlight 实际为一个苹果官方研发的一款提供给ios开发者内测的一个工具类App 这款app可以在苹果商店搜索到 用户直接搜索打开Te
  • java 图形与动画_如何优化java动画编程中的显示效果

    展开全部 Java动画编62616964757a686964616fe4b893e5b19e31333264623234程有多种实现方法 但它们实现的基本原理是一样的 即在屏幕上画出一系列的帧来造成运动的感觉 Java多线程技术是Java动
  • C++——STL库中迭代器以及其代码实现简介

    文章目录 一 STL库中迭代器的简介 1 迭代器的定义 2 迭代器常用的运算 3 vector和deque提供的额外运算 4 迭代器的取值范围 二 STL库中迭代器的代码实现 总结 一 STL库中迭代器的简介 1 迭代器的定义 迭代器 it
  • ARouter初始化及跳转原理

    ARouter初始化及跳转原理 编译后生成文件 仓库类 class Warehouse Cache route and metas static Map
  • GZipStream归纳总结

    GZipStream 类 提供用于压缩和解压缩流的方法和属性 创建压缩流实例有个参数枚举CompressionMode 它有两个值分别是Compress DeCompress 表示压缩和解压 压缩和解压代码 实例化FileStream对象i
  • ZGC垃圾收集器-JVM(十五)

    上篇文章说了G1的特性 无分代 复制算法 大内存就可以用G1 可预测stw时间等特性 G1垃圾收集分类 JVM 十四 ZGC收集器 XX UseZGC ZGC Z Garbage Collector 是在jdk11新加入的低延迟垃圾收集器