Java最前沿的技术——zgc 600271股票

股票资讯  2021-03-26 10:35:31

原标题:Java-zgc的前沿技术

作者:CoderW

来源:分段故障不考虑社区

ZGC简介

ZGC(Z型垃圾收集器)是JDK 11引进的实验型垃圾收集器。其设计目标包括:

暂停时间不得超过10ms;

暂停时间不会随着堆的大小或活动对象的大小而增加;

支持8MB~4TB堆(未来支持16TB)。

一开始提出这个目标的时候,很多人觉得设计师是在吹牛。

但今天,似乎这些“打击”正在一个个实现。

最新的JDK15实现了“暂停时间不超过10ms”和“支持16TB堆”两个目标,官方明确指出JDK15中的ZGC不再是实验性的垃圾收集器,建议投入生产。

ZGC成熟了,面试问题还会远吗?

本文将从ZGC的设计理念出发,解释为什么ZGC在低延迟场景中表现如此出色。

核心技术

多重映射

为了更好地理解ZGC的内存管理,我们来看一下这个例子:

你在父母眼里是儿子,在女朋友眼里是男朋友。是全世界人面前最帅的人。你还有名字,但是名字只是你的代号,不是你自己。画一张这种关系的地图来显示:

在你父亲眼里,你是儿子;

在女朋友眼里,你说男朋友;

站在全世界的角度,你说世界上最帅的人;

如果世界上只有你的名字,通过“你的名字”、“你父亲的儿子”和“你女朋友的男朋友”,“世界上最帅的人”最终定位你自己。

现在让我们来看看ZGC的内存管理。

为了高效灵活地管理内存,ZGC实现了虚拟内存和物理内存两级内存管理,实现了物理内存和虚拟内存的映射关系。这与操作系统中虚拟地址和物理地址的设计思想基本一致。

当应用程序创建一个对象时,它首先在堆空间中申请一个虚拟地址,ZGC还在三个视图空间中为该对象申请一个虚拟地址:标记0、标记1和重新映射,它们对应于相同的物理地址。

图中标记为0、标记为1和重新映射的三视图是什么意思?

与上面的例子相比,这三种观点对应的是“在你父亲眼里”、“在你女朋友眼里”、“在全世界人眼里”。

三观中的地址都是虚拟地址,分别对应“父亲眼中的儿子”和“女朋友眼中的男朋友”......

最后,这些虚拟地址可以映射到同一个物理地址,在上面的例子中对应于“你”。

用一段简单的Java代码来表达这种关系:

在ZGC,这三个空间中只有一个在同一时间点有效。

为什么要这样设计?这是ZGC的天才。以虚拟空间为时间,这三个空间的切换是由垃圾收集的不同阶段触发的。通过限制三个空间同时只有一个空间,可以有效、高效地完成GC进程的并发操作。具体实现将在后面的ZGC并发处理算法部分详细描述。

染色指针

在讨论ZGC并发处理算法之前,我们需要添加一个知识点——着色指针。

众所周知,以前的垃圾收集器存储垃圾收集信息(标签信息、垃圾收集生成年龄...)在对象头的Mark Word中。例如:

如果有人是垃圾人,在他头上贴一个“垃圾”章;如果这个人不是垃圾,洗掉这个人头上的“垃圾”印记。

ZGC是这样做的:

如果有人是垃圾人。在此人的身份证信息中标明此人是垃圾。以后不管这个人在哪里刷身份证,别人都知道他是垃圾。也许有一天,当这个人醒来发现自己不再是垃圾人的时候,他会把这个人身份证上的“垃圾”标志去掉。

在这个例子中,“这个人”是一个对象,“身份证”是指向这个对象的指针。

ZGC用指针存储信息。这项技术有一个很高的名字——彩色指针。

在64位机器中,对象指针是64位的。

ZGC使用64位地址空间的第0~43位来存储对象地址,2^44 = 16TB,因此ZGC支持最大16TB的堆。

第44 ~ 47位用作颜色标志,标记0、标记1和重新映射表示三个视图标志,可终结表示只能通过终结器访问该对象。

把48~63位固定为0是没用的。

阅读障碍

读屏障是一种JVM将一小块代码插入应用程序代码的技术。当应用程序线程从堆中读取对象引用时,将执行该代码。不要把这个读屏障和Java内存模型中的读屏障混淆了。它们根本不是一回事。ZGC的读屏障更像是一种AOP技术,它在字节码级或编译代码级给读操作增加了额外的处理。

阅读障碍示例:

Object o = obj。字段//要从堆中读取对象引用,您需要添加一个读屏障

& lt此处需要负载屏障>。

对象p = o //不需要添加读屏障,因为引用不是从堆中读取的

O.dosomething //不需要加入读屏障,因为引用不是从堆中读取的

Int i = obj。FieldB //不需要加入读屏障,因为它不是对象引用

ZGC阅读障碍的代码功能:

GC线程和应用线程同时执行,所以当应用线程转到对象a中引用指向的对象b时,这个对象b正在被GC线程移动或操作。添加读屏障后,应用线程将检测对象b是否被GC线程操作,然后等待操作完成后再读取对象,以保证数据的准确性。具体检测和操作步骤如下:

这会影响节目的表现吗?

是的。根据测试,性能损失高达4%。但这是ZGC并行转移的基础。为了减少STW,设计师认为这种牺牲是可以接受的。

ZGC并行处理算法

ZGC并发处理算法利用全局空间视图和对象地址视图的切换,结合SATB算法实现高效并发。

以上准备都是为了说明ZGC的并发处理算法。在一些博客文章中,说染色指针和阅读障碍是ZGC的核心,但没有明确说明它们在算法中是如何使用的。我认为ZGC的并发处理算法是ZGC的核心,染色指针和读障只为算法服务。

ZGC并发处理算法的三个阶段的全局视图切换如下:

初始化阶段:在ZGC初始化之后,整个内存空间的地址视图被设置为重新映射

标记阶段:进入标记阶段时,视图变为标记0(以下简称M0)或标记1(以下简称M1)

过渡阶段:当从标记阶段结束进入过渡阶段时,视图被再次设置为“重新映射”

标记阶段

标记阶段全局视图切换到M0视图。因为应用程序和标记线程同时执行,所以对象的访问可能来自标记线程和应用程序线程。

在标记阶段结束时,对象的地址视图要么是M0,要么是重新映射。

如果对象的地址视图是M0,则该对象是活动的。

如果对象的地址视图被重新映射,这意味着该对象是非活动的,即该对象使用的内存可以被回收。

标记阶段结束后,ZGC会将所有活动对象的地址存储在对象的活动信息表中,活动对象的地址视图全部为M0。

转移阶段

过渡阶段切换到重新映射视图。因为应用程序和传输线程也同时执行,所以对对象的访问可能来自传输线程和应用线程。

此时,在ZGC的一个垃圾收集周期中,并发标记和并发传输已经结束。

为什么要设计M0和M1

我们提到在标记阶段有两种地址视图M0和M1。上面的算法显示只使用了一个地址视图。为什么要设计两个地址?简单来说,就是区分之前的标记和现在的标记。

ZGC根据页面回收部分内存,也就是说当需要回收对象所在的页面时,需要转移页面中的对象,如果不需要转移页面,则不需要转移页面中的对象。

如图所示,在第二个垃圾收集周期开始时,该对象的地址视图仍然是M0。如果第二个垃圾收集器的标记阶段被切换到M0视图,就无法区分对象是活动的还是被最后一次垃圾收集标记的。此时,如果将第二个气相色谱循环的标记阶段切至M1视图,则可以区分出来。此时,这三个地址视图所代表的含义是:

M1:垃圾收集中识别的活动对象。

M0:在前一次垃圾收集的标记阶段被标记的活动对象。该对象未在传输阶段传输,但在此垃圾回收中被识别为非活动对象。

重新映射:在前一个垃圾收集的传输阶段传输的对象或应用程序线程访问的对象在此垃圾收集中被标识为非活动对象。

现在,我们可以回答“使用地址视图和着色指针有什么好处?”

使用地址视图和着色指针可以加快标记和传输速度。前者垃圾收集器通过修改对象头的标记位来标记GC信息,通过内存访问来访问,而ZGC不需要通过地址查看和染料指针技术来访问任何对象,只需要在地址中设置对应的标记位即可。这就是为什么ZGC在标记和转移阶段更快。

当GC信息不再存储在对象头上而存在于引用指针上时,当确定某个对象无用时,可以立即重用对应的内存空间,这是通过将GC信息放在对象头上无法实现的。

ZGC台阶

ZGC采用标记复制算法,标记、转移和重新定位阶段几乎同时进行。ZGC的垃圾收集周期如下图所示:

ZGC只有三个STW阶段:初始标记、重新标记和初始转让。

其中,初始标记和初始转移只需要扫描所有的GC root,处理时间与GC root的数量成正比,通常需要的时间非常短;

在重新标记阶段,STW时间非常短,可达1毫秒,并再次进入并发标记阶段。也就是说,几乎所有的ZGC暂停都只取决于垃圾回收根集合的大小,暂停时间不会随着堆或活动对象的大小而增加。与ZGC相比,G1的转移阶段完全是STW式的,停顿时间随着幸存物体的大小而增加。

ZGC的发展

ZGC出生在JDK11。经过不断改进,JDK15中的ZGC不再是实验品。

从只支持Linux/x64到现在支持多个平台;永远不要支持指针压缩,支持压缩的类指针.....

在JDK16中,ZGC将支持并发线程堆栈扫描。根据SPECjbb2015的测试结果,实施并发线程堆栈扫描后,ZGC的STW时间可以减少一个数量级,暂停时间将进入毫秒级时代。

ZGC已经是一个优秀的垃圾收集者了。它借鉴了Pauseless GC,似乎是向C4 GC发展——引入了代的思想。

在甲骨文的努力下,我们的开发者看到了商业级GC“飞入寻常百姓家”的希望。随着JDK的发展,我相信在未来的某一天,JVM调优的反人类操作将不复存在,底层GC会在各种情况下自动优化自己。

ZGC确实是Java的尖端技术,但是在G1不流行的今天谈论ZGC似乎还为时过早。但也许我们讨论的不是ZGC,而是ZGC背后的设计理念。

希望你能有所收获!回搜狐多看

负责编辑:


以上就是Java最前沿的技术——zgc600271股票的全部内容了,喜欢我们网站的可以继续关注会瑶股票网其他的资讯!

相关推荐

上汽一季度营收1890亿元整车销量增长超60%
4月30日,首创获悉,A股公司上汽集团(600104.SH)发布2021年第一季度报告全文。上汽集团发布2021年一季度报告全文...
注册资金10亿元!孚能科技与吉利科技合作布局新能源电池生产基地
5月18日,国都获悉,科创板公司富能科技(688567.SH)发布关于自愿披露战略合作进展并签署合资协议的公告公司。2021年5...
财务数据前后之战?佳创生物创新板IPO能否顺利进行?
4月25日,首创获悉,上交所科创板上市委员会定于2021年4月29日上午9时召开2021年第27次上市委员会审议大会,届时武汉佳...
欧盟征收碳税的原因是什么?欧盟征收碳税的目的是什么?
欧盟征收碳税。2008年,欧盟立法将国际航空纳入欧盟碳排放体系,并于2012年实施,这意味着现在所有在欧盟境内飞行的航空公司的排...
2021年柴蔚U70发布,从77,900起步,轴距2800毫米
日前,苏彻从官方获悉,柴蔚汽车的2021款U70(参数|图片)已经上市。总共引进了六辆新车。五个版本的官方指导价为人民币7790...
十年原创,沃尔沃做对了什么?
2020年,当全球暂停按钮被按下时,所有人都被迫停下来,开始了漫长而焦虑的人生竞赛。人们在反思,战斗和拳打得更厉害了。值此新旧交...
大众朗逸最新推出2015年汽车降价优惠
【天津报价】近日,中国汽车消费网编辑从北京广元叶巍大众店展厅了解到,大众朗逸正在店内销售,团购活动正在进行中。目前购车有优惠,是...
原厂三缸家用车加新!卡罗拉VS福克斯怎么选?
几年前,当我们还在讨论直六好还是V6顺滑的时候,三缸发动机已经悄然占据了不少市场份额。然而,中国消费者对三缸机的排斥是前所未有的...
原装买什么X5?重达2吨,加速5.9S,四轮驱动托森空气悬架,有了它,GLE就没有什么可做的了
在目前的大中型SUV系列中,新一代宝马X5确实有着非常好的精致度表现,线条的运用在整体设计上也达到了极致,在整体大气呈现上确实有...

友情链接