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

上篇文章说了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位还未使用,预留给以后使用。

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

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

相关文章

42. 接雨水

42.接雨水 这是一个简单的动态规划问题,虽然leetcode将它归结为困难。 但是我感觉它难度应该达不到,可能归结为中等比较合适0x1 题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨…

迁移学习的使用

network resnet34(pretrainedTrue) self.x nn.Sequential(*list(network.children())[4:5]) for name, layer in self.x.named_children(): layer[0].conv1nn.Conv2d(64, 128, kernel_size3, stride 2, padding 1, biasFalse) # 获取模型的参数字典network.conv1 nn.Conv2d(…

python flask 返回中文乱码

使用flask返回数据中带有中文的时候会显示成乱码(ascii), 中文报文: ABAP中的三大财务报表是:* **资产负债表** * **收入证明** * **现金流量表**这些报表全面概述了公司的财务状况和业绩。* **资产负债表**显示公司在特定时间点的资产、负…

【Python数据分析】Python基础知识篇

🎉欢迎来到Python专栏~Python基础知识篇 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒🍹 ✨博客主页:小夏与酒的博客 🎈该系列文章专栏:Python学习专栏 文章作者技术和水平有限,如果文中出现错误,希望大…

LeetCode[1508]子数组和排序后的区间和

难度:Medium 题目: 给你一个数组 nums ,它包含 n 个正整数。你需要计算所有非空连续子数组的和,并将它们按升序排序,得到一个新的包含 n * (n 1) / 2 个数字的数组。 请你返回在新数组中下标为 left 到 right &#…

将请求参数数据推送至RabbitMQ队列中并且捕捉消息没有到达交换机的异常

1:自定义mq信息类(我的交换这些信息都从nacos上直接取的,怎么从nacos取配置信息看上篇文章): import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor;impo…

线上办公场景下数据与网络安全合规

新型冠状病毒肺炎疫情仍在持续,封城、封路、封村等管制措施已成为常态。为配合防控工作,政府倡导各企业尽量在线上开展业务,各行各业都面临着一个突如其来的微数字化转型。 线上办公/运营并不是把线下的活动转移到线上那么简单,事…

docker安装gitlab 闭坑

docker安装gitlab: docker run --detach \--restart always \--publish 8433:443 --publish 880:80 --publish 822:22 \--name gitlab \--volume /home/gitlab/config:/etc/gitlab \--volume /home/gitlab/logs:/var/log/gitlab \--volume /home/gitlab/data:/var/opt/gitlab …

GB2312编码

说明 GB2312代码表用两个字节表示一个图形字符,两个字节中前面的字节为第一字节,后面的字节为第二字节。 区位码: GB2312代码表分成94个区,范围为1-94,区的编号由第一字节表示;每个区有94位,范…

AE 3D粒子插件trapcode particular 新版本

Trapcode Particular for Mac是目前AE系列的插件中最火爆最流行的一款三维粒子插件,是属于Red Giant Trapcode Suite(红巨人粒子特效套装插件)中的一款粒子插件。该软件提供了多达一百余种粒子效果供用户使用,可以产生各种各样的自…

【mac系统】mac系统调整妙控鼠标速度

当下环境: mac系统版本,其他系统应该也可以,大家可以自行试下: 鼠标 mac妙控鼠标,型号A1657 问题描述: 通过mac系统自带的鼠标速度调节按钮,调到最大后还是感觉移动速度哦过慢 问题解决&…

【Docker】什么是Docker呢?本文带你洞悉

🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前专攻C/C、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL、蓝桥杯&am…

学习day49

computed和watch的区别 1.computed能完成的功能,watch都可以实现 2.watch能完成的,computed不一定能实现,例如:watch可以进行异步操作 两个重要的小原则 1.所被Vue管理的函数,最好写成普通函数,这样this的指…

90道渗透测试面试题(附答案)

2023年已经快过去一半了,不知道小伙伴们有没有找到自己心仪的工作呀。最近后台收到不少小伙伴说要我整理一些渗透测试的面试题,今天它来了!觉得对你有帮助的话记得点个赞再走哦~ 1、什么是渗透测试? 渗透测试是一种评估计算机系统…

【MATLAB】 二维绘图,三维绘图的方法与函数

目录 MATLAB的4种二维图 1.线图 2.条形图 3.极坐标图 4.散点图 三维图和子图 1.三维曲面图 2.子图 MATLAB的4种二维图 1.线图 plot函数用来创建x和y值的简单线图 x 0:0.05:30; %从0到30,每隔0.05取一次值 y sin(x); plot(x,y) %若(x,y,LineWidth,2) 可…

【LeetCode 算法】Max Value of Equation 满足不等式的最大值-优先队列

文章目录 Max Value of Equation 满足不等式的最大值问题描述:分析代码优先队列 Tag Max Value of Equation 满足不等式的最大值 问题描述: 给你一个数组 points 和一个整数 k 。数组中每个元素都表示二维平面上的点的坐标,并按照横坐标 x …

【ShaderToy中图形效果转译到UnityShaderlab案例分享,实现粒子场_ParticleField】

Shader"ShaderToy/ParticleField" {Properties{_iMouse("iMouse", Vector) = (0,0,0,0)}SubSha

解密动态内存管理的奥秘(含内存4个函数)

目录 一.为什么存在动态内存管理 二.动态内存函数的介绍 1. malloc函数(memory alloc 内存开辟) 函数介绍: malloc函数使用举例代码: 2.free(释放) 函数介绍: 代码的示例&#xff1a…

C#WinForm获取当前活动子窗体使用鼠标滚轮事件改变窗体大小

获取当前活动子窗体使用鼠标滚轮事件改变窗体大小,实例在文末,可下载。 这个主要分三个重点 第一步 我们需要让子窗体显示在父窗体中 Form22 new Form2(); Form22.TopLevel false; // 不是顶级窗体 //Form22.Parent this;// 设置父窗体 一定不要…

配置NFS服务

环境 环境 ubuntu 10.4 vm 7.1 终端 ifconfig 得到 ubuntu资料 INET ADDR 192.168.0.4 BCAST 192.168.0.255 MASK 255.255.255.0 操作前先关闭防火墙 关闭防火墙: 命令:sudo ufw disable 打开防火墙 命令:sudo ufw enable 配置过程 一 安…