当前位置: 首页 > 网络应用技术

JVM从入境到放弃ZGC垃圾收集器

时间:2023-03-05 20:44:40 网络应用技术

  微信公共帐户:操作和维护发展故事,作者:郑兄弟

  ZGC概述

  Z垃圾收集器,也称为ZGC,是JDK 11中引入的可扩展的低删除垃圾收集器,并在JDK 15中发布了一个稳定的版本,以实现以下目标:

  ZGC具有以下特征:

  ZGC的核心是并发垃圾收集器,这意味着在Java线程继续执行时,所有重型任务均已完成。这极大地限制了垃圾收集对应用程序响应时间的影响。

  ZGC收集器基于区域内存布局。(临时)没有离婚。它使用诸如阅读屏障,染色指针和内存多映射等技术。目标的垃圾收集器。

  ZGC没有一代概念

  提到了ZGC的内存布局。就像Shenandoah和G1一样,ZGC也使用基于区域的桩内存布局,但与它们不同,ZGC的区域是动态的(动态创造和破坏,以及动态的区域容量)。在X64硬件平台下,ZGC的区域,ZGC的区域,可以具有大,中和小容量(如下图所示):

  NUMA对应于NMA,UMA,这是统一的记忆体系结构。NUMA是非统一的内存访问体系结构。乌玛意味着只有一块记忆。所有CUU都必须访问这些内存。如果您有竞争,您将被锁定。锁的效率将受到影响,并且CPU内核越多,越激烈的竞争越强。每个CPU都可以优先访问此内存,并且效率自然会提高。

  服务器的NUMA体系结构在中型和大型系统上非常受欢迎,即高性能解决方案,尤其是在系统延迟方面。ZGC可以自动感知NUMA架构并充分利用NUMA架构。

  彩色指针,即染色指针,如图所示,ZGC的核心设计之一。上一个垃圾收集器的GC信息存储在对象头中,ZGC GC信息存储在指针中(标记信息直接记录在对象的参考指针上)。EAVEN对象具有64位指针,这些64位被分为:

  为什么有两个标记?

  在每个GC周期的开头,将交换标记位置,以便在GC周期中更正的标签状态失败,并且所有参考都不会签名。GC循环1:使用Mark0,然后循环结束所有引号标记标记将成为01.GC周期2:使用Mark1,与周期1相同,所有标记标记将变为10。

  ZGC不能压缩吗?

  指针压缩是指32位的压缩,地址数字不能超过35位,也就是说,最大JVM存储器为32G(2^35 = 32GB),此处的地址站点的数量已达到42位。

  颜色指针的三个主要优势?

  可以在硬件级别,操作系统级别或软件级别上实现不同虚拟机内存与物理内存之间的转换关系。在Linux平台上,ZGC使用多个映射(多映射)来映射多个不同的虚拟内存地址地址的地址空间大于导管内存能力。相同的福利。如下图所示:多映射技术确实可以带来一些额外的好处,例如复制大对象,但是从来源中,ZGC的多映射只是带有染色指针的衍生产品它可以满足其他一些专业需求。

  ZGC使用读取屏障的方法来修改指针参考。由于ZGC使用复制和组织GC的方法,因此在更改对象的位置后未更新指针位置时,程序可能调用对象。在并行获取对象的引用时,ZGC将会读取对象的指针以确定重新映射的徽标。如果标识是这次需要清洁对象的区域区域,则对象将更改内存地址。新的参考地址由指针中原始对象的参考地址替换,然后返回。

  这样,使用屏障阅读并发症GC阅读屏障的问题。

  LoadBarrier的存在,因此ZGC的应用吞吐量将变得较低。官方测试数据需要额外的4%开销:

  ZGC的操作过程可以分为以下四个阶段:

  ZGC处理过程

  并发标记:像G1和Shenandoah一样,同时标记是暂停性能分析的外围对象图的阶段。ZGC是在指针而不是对象上执行的。标记阶段将在染色指针中更新标记的0和标记为1个徽标位置。

  同时准备重新安置:在此阶段,必须根据特定的查询条件来计算在此收集过程中清理哪些区域,并形成区域集。仍然存在重新分配集和该区域的区别G1收集器的集合集。ZGC将该区域划分的目的不是逐步恢复,例如G1.ON等收入的优先级,每次回收时,ZGC扫描所有区域,并使用较大的扫描成本来换取G1中内存收集的维护成本。因此,ZGC的重新分布集仅确定生存对象将被复制到其他区域,并且内部区域将被释放,并且不能说回收行为仅适用于该集合中的区域,因为在此阶段,JDK 12的ZGC中的类别卸载和较弱的参考处理也在此阶段完成。

  并发搬迁:重新分布是ZGC执行过程的核心阶段。此过程必须将重新分布的生存对象复制到新区域,并保持重新分布每个区域的过渡。(向前表,记录从旧对象到新对象的转向关系。谢谢,要在染色指针的支持下,ZGC Collector只能清楚地知道对象是否在re -Distribution集合中。如果发出了用户线程同时将在此时找到访谈。预设记忆屏障被拦截,然后立即根据该区域的重新定制表格重新访问对新复制的对象的访问,并且参考值的值直接直接针对新的。对象。ZGC称此行为。指针的“自我修复”功能。

  这样做的优点是,只有对旧对象的第一次访谈才会落入转发,也就是说,只有一度慢一点,比较了brooks的转发指针Shenandoah,这是一个固定的费用,必须为每个对象访问支付。简而言之,对于用户程序的运行时间,ZGC的负载需要较低的负载。另一个直接好处是由于染色指针的存在。一旦复制了分配集中区域的生存对象,该区域就可以立即释放新物体的分配(但是必须保留转发,并且不能留下。,即使该物体中仍然有许多前所未有的指针。一旦使用了这些旧的指针,它们也可以自治。

  并发重新映射:重新映射是为了纠正整个堆中旧对象的旧对象的所有引用。从目标角度的角度来看,参考更新阶段与Shenandoah相同,但是ZGC的并发映射的并发映射并不是必须“紧急”完成的任务,因为前面提到的,甚至旧引用,它都可以自治。最多,这仅是第一次重新纠正和纠正操作。重新绘制以清理这些旧引用的主要目的是保持不变(并且可以在清理结束后释放此类附件收入),因此因此,ZGC在下一个垃圾收集循环中的并发标记阶段要完成的并发映射阶段巧妙地工作。可以释放旧对象和新对象之间的关系。

  -XX:+USEZGC允许ZGC-XMX设置最大内存堆堆:GC打印GC log-Xlog:gc*gc*打印GC详细日志ZGC Trigger ZGC触发GC方案:

  我们将分析以下简单程序以制作ZGC日志。以下是特定的代码和分析。

  以下是一个简单的代码:

  GC日志如下(运行环境JDK 17)。例如:GC日志中的每一行都标记为GC进程中的信息。关键信息如下:

  公共帐户:操作和维护开发故事

  github:https://github.com/orgs/sunshary- note/dashboard

  热爱生活,爱与维度

  原始:https://juejin.cn/post/7095643412082196511