JVM系统优化实践(24):ZGC(一)

您好,这里是码农镖局CSDN博客,欢迎您来,欢迎您再来~


截止到目前,算上ZGC,Java一共有九种类型的GC,它们分别是:

1、Serial GC 串行/作用于新生代/复制算法/响应速度优先/适用于单CPU下的client模式

2、ParNew GC 并行/作用于新生代/复制算法/响应速度优先/多CPU的Server模式与CMS配合使用

3、Parallel GC 并行/作用于新生代/复制算法/吞吐量优先/适用于后台运算且不需要太多交互

4、Serial Old GC 串行/作用于老年代/标记-整理算法/响应速度优先/单CPU下的Client模式

5、Parallel Old GC 并行/作用于老年代/标记-整理算法/吞吐量优先/适用于后台运算且不需要太多交互

6、CMS GC 并行/作用于老年代/标记-清除算法/响应速度优先/适用于互联网或B/S业务

7、G1 GC 并行/新生或老年代/标记-整理算法+复制算法/响应速度优先/面向服务端应用

8、Epsilon GC A No-Op GC

9、The Z GC 并发/单代/标记-整理算法+复制算法/响应速度优先/面向大数据应用

ZGC之前,下面几种GC算法是Java的主流。

1、CMS GC(JDK1.4)

2、ParNew GC(JDK1.6)

3、G1 GC(JDK1.8)

而JDK11采用了全新的GC算法。官方的介绍说它是一个Scalable和Low-Latency的GC(可以在OpenJDK官网上查JEP333)。

ZGC野心极大,其诞生之初的目标就是:

1、支持TB级别的堆内存(最大4TB)

2、最大GC停顿时间不超过10ms,且不随着堆的大小而变化

3、GC停顿期间,吞吐量降低不超过15%

4、可伸缩、低延迟

不同于以往任何的那种修修补补式的GC,ZGC不是从过去GC算法优化来的,而是全新的,JDK11的ZGC只能运行在Linux64位操作系统中(JDK14可以运行于Windows和Mac系统)。

它采用单代模型,没有了年轻代、老年代的划分,也就没有了Minor GC和Major GC的区别。

1、Region Based GC,和G1类似,但有更加灵活的region size schema,这也正是能处理TB即堆内存的原因

2、Partial Compaction,和G1一样的部分压缩

3、Colored Object Pointer,染色对象指针,使用三色标记实现对象清理

4、Multi-Mapping,内存多重映射

5、使用Load Barrier(读屏障)技术修正GC扫描结果

6、Concurrent,ZGC几乎总是以并发的形式完成所有的工作

下面一个一个来说一下。

关于单代模型:

以前的GC模型之所以分代,是源于对象生命周期极短的假设。

实现分代模型非常麻烦,为了判断是年轻代还是老年代,G1通过Remembered Set记录Region对象之间的双向引用关系,这种跟踪跨代引用的任务特别繁重。所以ZGC的做法是控制停顿阶段做的事情不和堆中的对象产生直接关联,所有在堆上进行的扫描、分配、复制等操作都是并发的,通过扫描整个堆和染色指针技术,ZGC成功去除了Remembered Set。

关于Region区域:

和G1一样,都是基于内存Region设计的GC。但它和G1固定大小的Region不同,ZGC中每个Region大小分为3类:2MB、32MB、N×32MB这几种「规格」:

1、容量2MB的Small Page存放 < 256KB的小对象

2、容量32MB的Medium Page存放 >= 256KB 且 < 4MB的对象

3、容量N×32MB的Large Page存放 >= 4MB的大对象,每个Page只放一个对象

ZGC Region的核心亮点就是动态:动态地创建和销毁,动态地决定Region的大小。

Region区域看起来就想这样的:

 

关于部分压缩:

以前的ParallelOldGC、CMS,无论老年代有多大,都会进行整体压缩,从而Old区越大,导致停顿时间越长。而G1和ZGC是基于Region实现的,因此只会选择部分Region进行回收,这一点G1和ZGC是一样的。

关于染色指针:

ZGC的一个核心概念就是染色指针,这里是借用一个形象的说法,并非是真的给指针“染色”,它是指在GC时标记哪些对象是可回收的,即GC Roots过程。传统HopSpot虚拟机的标记实现方案是直接将标记记录在对象头部信息上,再把标记信息记录在与对象相互独立的数据结构上,如G1的Remembered Set。而ZGC是直接把标记信息记录在引用对象的指针上,这是一种直接将少量的额外信息存储在指针上的技术。目前在64位的Linux系统中,高18位预留不能使用,剩余的46位最大可支持64TB的内存空间。

ZGC将46位中的高4位取出来,用于存储染色标识信息(Finalizable、Remapped、Marked1、Marked0),用剩余的42位地址来管理4TB内存空间。

1、Finalizable:表示对象是否只能通过finalize()方法访问,其他途径是访问不了的

2、Remapped:表示对象是否已被重新映射,即是否已指向新的地址

3、Marked1、Marked0:表示对象的三色标记状态,对象是否已被标记

之所以使用两个Marked0和Marked1标记,是因为每个GC周期开启时,会交换使用的标记位。

 


感谢您的大驾光临!欢迎骚扰,不胜荣幸~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pointpillars在Ubuntu2004训练的总结

1、找到pointpcdet-master之后在此打开终端输入code进入VScode界面 code 2、激活pp环境 conda activate pp 3、cd进入tools cd tools 4、将kitti数据集准备好放入data路径下之后开始训练 python train.py --cfg_file cfgs/kitti_models/pointpillar.yaml 5、训练完成之…

GraphGT: Machine Learning Datasets for Graph Generation and Transformation

一、文章来源 > Du Y, Wang S, Guo X, et al. Graphgt: Machine learning datasets for graph generation and transformation[C]//Thirty-fifth Conference on Neural Information Processing Systems Datasets and Benchmarks Track (Round 2). 2021.二、概述 1、文章提出…

CMU-CERT内部威胁数据集 r4.2版本介绍

CMU-CERT内部威胁数据集 r4.2版本介绍 一、相关介绍二、CMU-CERT r4.2版本内容三、重大变更 一、相关介绍 “CMU”是卡内基梅隆大学&#xff08;Carnegie Mellon University&#xff09;的简称。 “CERT”是卡内基梅隆大学的一个研究中心叫“CERT”&#xff0c;主要研究内部威…

汇川伺服常见故障处理

伺服系统故障拓扑图 Er.941 变更参数需重新上电生效 产生机理:伺服驱动器的功能码属性“生效时间”为“再次通电”时,该功能码参数值变更后,驱动器提醒用户需要重新上电。 原因 确认方法 处理措施 变更了再次通电后更改生效的功能码 确认是否更改了“生效时间”为“重新上电…

PLC拉格朗日插值(SCL、ST计算源代码)

插值是对函数进行近似的基本方法,这篇博客主要介绍常用的拉格朗日插值法, Lagrange插值法不太清楚的同学,可以看看数值计算和分析类书籍,网上有很多C语言的拉格朗日插值算法,这里我们主要给出在PLC里利用ST,SCL语言完成拉格朗日插值计算。 1、拉格朗日插值FC 插值法可以…

状态模式——对象状态及其转换

1、简介 1.1、概述 在软件系统中&#xff0c;有些对象也像水一样具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;而且对象在不同的状态下也将具有不同的行为。为了更好地对这些具有多种状态的对象进行设计&#xff0c;可以使用一种被称为状态模式的设…

如何把pdf转成cad版本?这种转换方法非常简单

将PDF转换成CAD格式的优势在于&#xff0c;CAD格式通常是用于工程设计和绘图的标准格式。这种格式的文件可以在计算机上进行编辑和修改&#xff0c;而不需要纸质副本。此外&#xff0c;CAD文件通常可以与其他CAD软件进行交互&#xff0c;从而使得工程设计和绘图过程更加高效和精…

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…

安全渗透知识总结二

目录 一、html实体编码 1、Unicode字符编码 2、字符的数字表示 3、常见实体编码 4、url 协议 主机 http状态码 http常用的状态码 端口 常见协议端口 查询参数 锚点 url字符 urlcode字符 绝对url和相对url 二、字符编码 Ascll字符集 html字符集 html的url编码 …

thinkphp8.0多应用模式下提示控制器不存在

thinkphp 8.0 开启多应用模式 1、按照官方文档说明 &#xff0c;已经安装了 think-multi-app composer require topthink/think-multi-app 2、控制器的命名空间也没写错。 3、访问路径与目录名、控制器、方法名一样&#xff0c;访问地址是没错的。 4、网上有说&#xff0c;在…

ubuntu调整路由顺序

Ubuntu系统跳转路由顺序 1、安装ifmetric sudo apt install ifmetric2、查看路由 route -n3、把Iface下面的eth1调到第一位 sudo ifmetric eth1 0命令中eth1是网卡的名称&#xff0c;更改网卡eth1的跃点数&#xff08;metric值&#xff09;为0&#xff08;数值越小&#xf…

Java实现Google授权登录,OAuth 2.0登录

首先创建OAuth 2.0 客户端 ID 配置url&#xff0c;必须是https的&#xff0c;同时复制好客户端id 和密钥 配置回调url /*** Google授权登录跳转。但是会重定向&#xff0c;建议前端跳转** 前端js* // 构建 Google 授权 URL* const authParams new URLSearchParams({* resp…

java linq多字段排序时间比较

public static void main(String[] args) {//100万条数据List<CrmInvestSaleUserCount> waitAssignUserList new ArrayList<>();for (int i 0; i < 1000000; i) {waitAssignUserList.add(new CrmInvestSaleUserCount().setSales_username("test" i…

单元测试之 - Spring框架提供的单元/集成测试注解

Spring框架提供了很多注解来辅助完成单元测试和集成测试(备注&#xff1a;这里的集成测试指容器内部的集成测试&#xff0c;非系统间的集成测试)&#xff0c;先看看Spring框架提供了哪些注解以及对应的作用。RunWith(SpringRunner.class) / ExtendWith(SpringExtension.class)&…

KepwareEX配置API REST接口

服务端Kepware设置 API允许连接设置 创建通道 请求地址(POST)&#xff1a; https://<主机名_或_ip>:<端口>/config/v1/project/channels 以下示例使用postman工具访问API创建了一个名为Channel1 的通道&#xff0c;其使用在本地主机运行的服务器中的Simulator …

VSCode如何在行内显示变量值

背景 在调试时&#xff0c;我们希望能够直接在代码行显示变量的值&#xff0c;而不是总是去侧边栏查看&#xff0c;如下这种&#xff0c;y12直接显示在代码行。那么VSCode中如何做呢 设置 VSCode提供了“inline values”设置&#xff0c;但为了速度&#xff0c;默认并没有开…

Python3 网络爬虫开发实战

第二章 基本库的使用 urlib的使用 比较好用的是parse模块来进行URL的各种处理&#xff0c; requests的使用 requests库也可以session维持&#xff0c;srequests.Session(),s.get(url‘…’) 有些网站没有设置好HTTPS证书&#xff0c;导致出现不是私密连接的错误&#xff0c…

Ubuntu开机自启服务systemd.service配置教程(Ubuntu服务)(Linux服务)upstart

文章目录 为什么要将程序配置成服务&#xff1f;1. 自动启动2. 后台运行3. 定时重启4. 简化管理5. 整合系统 版本支持1. Ubuntu 14.04及更早版本&#xff1a;使用upstart作为默认的init系统/etc/rc.local旧版本新版本 2. Ubuntu 15.04到16.04版本&#xff1a;默认使用systemd作…

6.s081/6.1810(Fall 2022)Lab5: Copy-on-Write Fork for xv6

前言 本来往年这里还有个Lazy Allocation的&#xff0c;今年不知道为啥直接给跳过去了。. 其他篇章 环境搭建 Lab1: Utilities Lab2: System calls Lab3: Page tables Lab4: Traps Lab5: Copy-on-Write Fork for xv6 参考链接 官网链接 xv6手册链接&#xff0c;这个挺重要…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…