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周期开启时,会交换使用的标记位。

 


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

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

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

相关文章

C++教程 - How to C++系列专栏第0篇

关于专栏 这个专栏是优质的C教程专栏 本专栏一致使用操作系统&#xff1a;macOS Ventura&#xff0c;代码编辑器&#xff1a;CLion&#xff0c;C编译器&#xff1a;Clang 感谢一路相伴的朋友们&#xff0c;感谢你们的支持 ^ _ ^ 博主反馈非常及时&#xff0c;如果你在阅读…

NativePHP:使用PHP构建跨平台桌面应用的新框架

NativePHP是一个用于使用PHP构建桌面应用的框架。它允许PHP开发人员使用熟悉的工具和技术创建跨平台的原生应用。NativePHP具有一系列易于使用的类&#xff0c;一套用于构建和打包应用程序的工具以及一个静态跨平台PHP运行时。 官网地址&#xff1a;https://nativephp.com PH…

真的不想知道录音转文字怎么弄才简单吗

哇哦&#xff01;听说你想知道如何将录音转成文字&#xff1f;这简直是一个超酷的技能&#xff0c;让我来为你揭开这个神奇的面纱吧&#xff01;想象一下&#xff0c;当你有一堆录音文件需要处理时&#xff0c;你不再需要费尽心思地一遍遍倾听、抄写。现在&#xff0c;你只需要…

LumenSceneData 初始化 [1]

前置信息&#xff1a; 灯光从World到Scene的流程。 UE4 Lights UWorld to FScene [1]_spawnactor failed because of collision at the spaw_sh15285118586的博客-CSDN博客 mesh从world到Scene流程&#xff0c;与灯光类似 void UStaticMeshComponent::CreateRenderState_Con…

Kubectl 详解

目录 陈述式资源管理方法:项目的生命周期:创建-->发布-->更新-->回滚-->删除声明式管理方法:陈述式资源管理方法: kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将…

基于YOLOv7的密集场景行人检测识别分析系统

密集场景下YOLO系列模型的精度如何&#xff1f;本文的主要目的就是想要基于密集场景基于YOLOv7模型开发构建人流计数系统&#xff0c;简单看下效果图&#xff1a; 这里实验部分使用到的数据集为VSCrowd数据集。 实例数据如下所示&#xff1a; 下载到本地解压缩后如下所示&…

webpack 静态模块打包工具

webpack 为什么? 把静态模块内容&#xff0c;压缩&#xff0c;整合&#xff0c;转译等(前端工程化) 把less/sass转成css代码把ES6 降级成ES5支持多种模块文件类型&#xff0c;多种模块标准语法 vite 为什么不直接学习vite 而学习webpack 因为很多项目还是基于webpack来进…

js 判断对象为数组.html

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>数组判断</title> </head> <body> <script> function isArray(obj) { /* 判断对象 obj 是否是数组。*/ return typeof o…

vue加载大量数据优化

在Vue中加载大量数据并形成列表时&#xff0c;可以通过以下方法来优化性能&#xff1a; 分页加载&#xff1a;不要一次性加载所有的数据&#xff0c;而是分批加载数据&#xff0c;每次只加载当前页需要显示的数据量。可以使用第三方库如vue-infinite-loading来实现无限滚动加载…

找免费商用的图片素材就上这6个网站。

分享6个免费商用的高清图片素材库&#xff0c;你想要找到这里都能找到&#xff0c;赶紧收藏起来吧~ 菜鸟图库 https://www.sucai999.com/pic.html?vNTYwNDUx 网站主要是为新手设计师提供免费素材的&#xff0c;素材的质量都很高&#xff0c;类别也很多&#xff0c;像平面、UI…

Git Submodule 更新子库失败 fatal: Unable to fetch in submodule path

编辑本地目录 .git/config 文件 在 [submodule “Assets/CommonModule”] 项下 加入 fetch refs/heads/:refs/remotes/origin/

常规VUE项目优化实践,跟着做就对了!

总结&#xff1a; 主要优化方式&#xff1a; imagemin优化打包大小&#xff08;96M->50M&#xff09;&#xff0c;但是以打包速度为代价&#xff0c;通过在构建过程中压缩图片来实现&#xff0c;可根据需求开启。字体压缩&#xff1a;目前项目内引用为思源字体&#xff0c…

认识所有权

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

C++——文件操作

一、文本文件 C中输入输出是通过流对象进行操作&#xff0c;对于文件来说写文件就是将内容从程序输出到文件&#xff0c;需要用到写文件流ofstream&#xff1b;而读文件就是将内容从文件输入到程序&#xff0c;需要用到读文件流ifstream&#xff1b;这两个文件流类都包含在头文…

f1tenth的多点导航+路径规划+pursuit追踪

文章目录 一、发布起点,终点二、 记录规划轨迹点三、pursuit追踪一、发布起点,终点 pub_amcl: #!/usr/bin/env python3import rospy from geometry_msgs.msg import PoseWithCovarianceStampeddef publish_amcl_pose():# 初始化节点rospy.init_node(amcl_pose_publisher)# …

oracle的管道函数

Oracle管道函数(Pipelined Table Function)oracle管道函数 1、管道函数即是可以返回行集合&#xff08;可以使嵌套表nested table 或数组 varray&#xff09;的函数&#xff0c;我们可以像查询物理表一样查询它或者将其赋值给集合变量。 2、管道函数为并行执行&#xff0c;在…

P1257 平面上的最接近点对

题目 思路 详见加强加强版 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn4e510; pair<int,int> a[maxn]; int n; double d1e16; pair<int,int> vl[maxn],vr[maxn]; void read() { cin>>n;for(int i1;i<…

Android性能优化—数据结构优化

优化数据结构是提高Android应用性能的重要一环。在Android开发中&#xff0c;ArrayList、LinkedList和HashMap等常用的数据结构的正确使用对APP性能的提升有着重大的影响。 一、ArrayList ArrayList内部使用的是数组&#xff0c;默认大小10&#xff0c;当数组长度不足时&…

二叉排序树(二叉查找树)

二叉排序树&#xff08;二叉查找树&#xff09;的性质&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有结点的值均小于它的根结点的值。若它的右子树不为空&#xff0c;则右子树上所有结点的值均大于它的根将诶点的值。它的左、右子树也分别为二叉排序树。 对二叉…