热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JEP333:ZGC:一个可伸缩低延迟的垃圾收集器(实验性的)

原文链接:http:openjdk.java.netjeps333作者PerLiden,StefanKarlsson所有人PerLiden类型特征范围实现当前状态结束已交付发布11

原文链接:http://openjdk.java.net/jeps/333
作者 Per Liden, Stefan Karlsson
所有人 Per Liden
类型 特征
范围 实现
当前状态 结束/已交付
发布 11
组成 hotspot / gc
讨论 hotspot dash gc dash dev at openjdk.java.net
Effort L
持续 L
依赖项 JEP 312: 局部线程握手
JEP 304: 垃圾收集器接口
评估 Mikael Vidstedt, Stefan Karlsson
支持 Mikael Vidstedt
创建时间 2018/02/13 09:58
更新时间 2018/11/30 16:31
Issue 8197831

概要
Z 垃圾收集器,也被移为ZGC,是一种可伸缩的低延迟的垃圾收集器

目标:

  • GC暂停时间不应超过10ms
  • 可处理堆的范围从相对较小(几百MB)到非常大的(多TB)
  • 与使用G1相比之下,应用程序吞吐量减少不超过15%
  • 为将来的GC特性和利用彩色指针和负载屏障的优化打下基础
  • 最初支持的平台:Linux/X64

我们有很强烈的抱负,要在大量相关工作负载下实现这些目标。与此同时,我们也要承认,我们并不认为这些目标是每个可想象工作量的硬性要求
未实现的目标:
它的目标不是为Linux/x64以外的平台提供工作实现。
如果有足够的需求,可以稍后添加对其他平台的支持

动机:
垃圾收集是Java的主要优势之一.然而,当垃圾收集暂停时间过长它们将会对程序的响应时间产生影响.通过删除或大幅减少GC暂停的时长,我们将使Java成为更广泛的应用程序集的更有吸引力的平台
此外,现代系统中可用的内存数量还在继续增长。用户和应用程序开发人员希望JVM能够以一种有效的方式充分利用这种内存,并且不需要很长的GC暂停时间
描述:
一目了然,ZGC是一个并发的,单一代的,基于区域的NUMA感知的压缩收集器.STW阶段仅限于根描述.因此GC暂停时间不会随着堆或活动集的大小而增加.
ZGC的核心设计原则/选择是将负载障碍与彩色对象指针(即colored oops)结合使用。这使得ZGC能够在Java应用程序线程运行时执行并发操作,例如对象重定位。从Java线程的角度来看,在Java对象中加载引用字段的行为受到加载障碍的影响。除了对象地址之外,有色对象指针还包含加载屏障使用的信息,以确定在允许Java线程使用指针之前是否需要采取某些操作。例如,对象可能已被重新定位,在这种情况下,加载屏障将检测情况并采取适当的操作.
与替代技术相比,我们认为彩色指针方案提供了一些非常有吸引力的特性。特别是:

  • 它允许我们在重定位/压缩阶段回收和重用内存,然后修复指向回收/重用区域的指针。这有助于降低一般堆开销。这也意味着不需要实现单独的mark-compact算法来处理完整的GC。

  • 它允许我们拥有相对较少且简单的GC障碍。这有助于降低运行时开销。这也意味着在我们的解释器和JIT编译器中实现,优化和维护GC屏障代码更容易。

  • 我们目前在彩色指针中存储标记和重定位相关信息。但是,这种方案的通用性使我们能够存储任何类型的信息(只要我们可以将它放入指针中),并让负载屏障根据该信息采取它想要的任何动作。我们相信这将为未来的许多功能奠定基础。举一个例子,在异构内存环境中,这可以用于跟踪堆访问模式,以指导GC重定位决策,以便将很少使用的对象移动到冷存储。
    性能:
    使用SPECjbb®2015[1]进行了定期性能测量。从吞吐量和延迟的角度来看,性能看起来都很好。下面是使用128G堆的复合模式下比较ZGC和G1的典型基准分数(百分比,相对于ZGC的max-jOPS标准化)。

(越高越好)

ZGC
max-jOPS: 100%
critical-jOPS: 76.1%

G1
max-jOPS: 91.2%
critical-jOPS: 54.7%
以下是来自同一基准的典型GC暂停时间。ZGC设法远远低于10毫米的目标。请注意,确切的数字可能会有所不同(向上和向下,但不显着),具体取决于所使用的确切机器和设置。

(越低越好)

ZGC
avg: 1.091ms (+/-0.215ms)
95th percentile: 1.380ms
99th percentile: 1.512ms
99.9th percentile: 1.663ms
99.99th percentile: 1.681ms
max: 1.681ms

G1
avg: 156.806ms (+/-71.126ms)
95th percentile: 316.672ms
99th percentile: 428.095ms
99.9th percentile: 543.846ms
99.99th percentile: 543.846ms
max: 543.846ms
还对各种其他SPEC®基准测试和内部工作负载进行了特别性能测量。通常,ZGC设法保持一位数毫秒的暂停时间。

[1]SPECjbb®2015是标准性能评估公司(spec.org)的注册商标。实际结果未表示为合规,因为SUT可能不符合SPEC对一般可用性的要求。
限制:
ZGC的初始实验版本不支持类卸载。在ClassUnloading和ClassUnloadingWithConcurrentMark选项会默认被禁用。启用它们将不起作用。

此外,ZGC最初不会支持JVMCI(即Graal)。如果EnableJVMCI启用该选项,将打印错误消息。

这些限制将在本项目的后期阶段解决。
构建和调用:
按照惯例,构建系统默认禁用JVM中的实验-性-功-能。因此,作为实验-性-功-能的ZGC将不会出现在JDK构建中,除非在编译时使用configure选项明确启用--with-jvm-features=zgc。

(ZGC将出现在Oracle生成的所有Linux / x64 JDK版本中)

JVM中的实验功能也需要在运行时明确解锁。要启用/使用ZGC,因此需要以下JVM选项:-XX:+UnlockExperimentalVMOptions -XX:+UseZGC。

有关如何设置和调整ZGC的更多信息,请参阅ZGC项目Wiki.
备选方案:

  • 一个明显的替代方案是向G1添加并发压缩功能。这种替代方案已被广泛制作原型,但最终被放弃了 我们发现将这种功能强制转换为从未为此目的设计的代码库是不可行的,同时保留了G1的稳定性和其他良好的属性。
  • 理论上的替代方案是以某种方式改进CMS。然而,有几个原因使得基于CMS算法的低延迟收集器既不具有吸引力也不可行。原因包括不支持压缩,未绑定的注释阶段,复杂的代码库以及已经弃用的事实(JEP 291)。
  • Shenandoah项目正在探索使用Brooks指针来实现并发操作(JEP 189)。
    测试:
    我们现有的大多数功能和压力测试都是收集器无关的,可以按原样重复使用。将添加针对特定于ZGC的属性和功能的附加测试
    依赖:
    JEP 304:垃圾收集器接口
    JEP 312:线程局部握手

转:https://blog.51cto.com/8745668/2386910



推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
author-avatar
Hongquan_Yang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有