java zgc_ZGC:使Java成为更广泛的应用程序更具吸引力的平台

java zgc

JAXenter: Oracle为什么决定使Z Garbage Collector开源? 最终目标是什么?

PerLidén: 早在9月,Oracle提议将JDK发行节奏加快到六个月,并最终使OpenJDK二进制文件与Oracle JDK二进制文件可互换。 传统上,Oracle JDK包含OpenJDK中没有的商业功能。 我们打算将此类功能开源,并使其在OpenJDK中可用。 Z垃圾收集器(ZGC)就是这样的功能之一。

所有这些的最终目标是巩固Java作为第一开发平台的地位。 为此,我们消除了阻碍Java开发人员获得创新和新功能的障碍。

ZGC —使延迟成为Java应用程序的根本问题

JAXenter: 什么是ZGC项目?其目标是什么?

PerLidén: 垃圾收集是Java的主要优势之一。 但是,当垃圾回收暂停时间过长时,它们开始对应用程序的响应时间产生负面影响。 通过消除或大大减少GC暂停的时间,我们使Java成为了更广泛的应用程序更具吸引力的平台。

ZGC项目是更大的OpenJDK社区下的一个独立项目。 这是ZGC代码库持续开发的家园,其主要目标是创建一个垃圾收集器,该垃圾收集器可以处理中大型堆,同时保持非常短的GC暂停时间。

第二个目标是使GC调整变得简单。 OpenJDK中的当前大多数GC具有大量的调整选项,以使其能够在各种工作负载上正常工作。 但是,使用这些调整选项通常需要深入了解GC的内部工作方式以及面临的权衡问题。 大多数开发人员只是希望GC能够正常工作,而不必掌握这些知识。 在ZGC项目中,我们一直在努力创建一个GC,在不牺牲性能的情况下减少了对调优的需求。

JAXenter: 在发送给OpenJDK邮件列表的消息中 ,您说过您正在努力使其余GC任务/阶段并发。 你有进步吗?

ZGC现在已经可以为许多类型的应用程序提供非常短的暂停时间。 我们对ZGC能够同时进行参考处理感到特别满意。

PerLidén: 我在项目建议中提到的其余任务通常涉及除ZGC之外的JVM子系统。 例如,我们正在努力能够并发(即不停止Java线程的执行)卸载未使用的Java类。 这需要对JIT编译器和运行时子系统进行重大更改。 跨多个JVM子系统的更改本质上将需要一些时间才能完成。 我们正在不断取得进步,但还没有到位。

话虽如此,ZGC现在已经可以为许多类型的应用程序提供非常短的暂停时间。 我们对ZGC能够同时进行参考处理感到特别满意。 这意味着您的应用程序可以根据需要具有任意数量的“软/弱/最终/幻像引用”,而不会影响GC暂停时间。

JAXenter:ZGC 的关键原理是什么?

PerLidén: 从高层次 上讲 ,实现低延迟(尤其是在使用非常大的堆时)的关键是使GC与Java线程的执行同时运行。 如果必须在Java线程停止时(即,在Stop-The-World阶段)执行某项操作,则至关重要的是,完成该操作的时间不会随堆集或活动集的大小而增加。

在ZGC中,我们一直努力确保任何Stop-The-World阶段都将在恒定时间内执行,或者在最坏的情况下,将随着根集大小而增加。 根集大小与正在运行的Java线程数大致相关。

在查看ZGC中使用的特定技术时,我们认为将彩色指针与低开销负载屏障结合使用是非常强大而又简单的基础,并且是并发的关键实现因素。

还请参见: OpenJDK HotSpot垃圾回收[VIDEO]的性能工程师指南。

JAXenter: 与其他替代方案相比,结合使用负载屏障和有色对象指针有何优势?

PerLidén 像ZGC这样的并发垃圾收集器需要在收集垃圾并回收内存的同时为来自Java线程的分配请求提供服务。 这意味着堆中必须有足够的净空(即可用内存)以保持该循环的进行。 如果并发垃圾收集器无法跟上并耗尽内存(即堆已满),它将别无选择,只能停止,减慢速度或以其他方式影响Java线程进行分配。 这显然对延迟不利。 对此的补救措施是为GC提供更大的堆以供处理(即增加空间),但是同时,您也不想浪费内存。

因此,您希望并发垃圾收集器能够尽快回收和重新使用内存。 在ZGC中,使用彩色指针和负载屏障使我们可以在重定位/压缩阶段中回收和重用内存,而早于固定/调整了指向堆的回收/重用部分的指针。 许多垃圾收集器通常要求固定这些悬空指针,然后将它们指向的内存区域回收并重新用于新分配。 这听起来似乎无害,但是修复这些悬空指针通常是一项昂贵的操作,需要花费一些时间才能完成,因此延迟了回收和重用。

保持负载屏障的运行时开销最小化是另一个重要方面。 在ZGC中,执行负载屏障意味着执行测试和跳转指令序列,现代CPU中的分支预测逻辑可以很好地处理该指令和跳转指令序列。 此外,ZGC使用了所谓的“空间不变”,这尤其意味着ZGC不需要任何存储障碍,并且代码流中需要注入负载障碍的位置数量相对有限。

通过消除或大大减少GC暂停的时间,我们使Java成为了更广泛的应用程序更具吸引力的平台。

彩色指针和负载屏障的组合提供了一种通用的机制,可以在此机制上构建将来的功能。 今天,ZGC将与标记和重定位有关的信息存储在指针中,但是我们基本上可以在其中存储任何类型的信息,并让负载屏障使用该信息采取某些特殊措施。 例如,此信息可以告诉负载屏障:我们正在加载的对象已压缩或换出为冷存储,并且我们需要解压缩或将对象移动到热存储。 其他示例可能是指针中的信息可以告诉负载屏障自上一个GC周期以来该对象已被访问(如果要跟踪堆访问模式,则很有用),这是一个“弱”指针,该对象是该对象指向的是“年轻”对象,这是“线程本地”对象,依此类推。

ZGC未来将如何利用这一点还有待观察,但我们相信我们为许多有趣的功能和优化奠定了良好的基础。

JAXenter: ZGC项目的初始来源将基于JDK 10存储库的克隆以及最新的ZGC补丁集。 随着项目越来越接近集成,将会发生什么?

PerLidén: 我们尚不知道是否,何时以及如何将其集成到JDK本身。 做出此类决策的先决条件是使其开源,以便人们可以对其进行测试和评估。 反馈和讨论将有助于指导我们如何进行。

JAXenter:ZGC 的下一步是什么?

PerLidén: 该项目已被批准为OpenJDK项目 。 我们希望对项目感兴趣的人可以尝试他们的工作量并分享经验。 我们将继续努力并改进ZGC本身以及JVM的其余部分,以使延迟对于Java应用程序而言不再是问题。

谢谢!

翻译自: https://jaxenter.com/zgc-interview-per-liden-139985.html

java zgc

你可能感兴趣的:(java zgc_ZGC:使Java成为更广泛的应用程序更具吸引力的平台)