JVM工作原理与实战(四十一):ShenandoahGC原理

简介: JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了ShenandoahGC、ShenandoahGC 1.0版本、ShenandoahGC 2.0版本、ShenandoahGC执行流程等内容。

一、ShenandoahGC介绍

ShenandoahGC与ZGC(Z垃圾收集器)在设计上存在着显著的差异。相较于ZGC的全新开发,ShenandoahGC在很大程度上是基于G1垃圾收集器的源代码进行改造的。因此,在算法选择、数据结构定义等多个方面,ShenandoahGC与G1展现出了很高的相似性。

  • ShenandoahGC在区域划分上沿用了G1的设计理念,确保了内存管理的有效性和高效性。
  • ShenandoahGC并未采用着色指针技术,而是通过优化对象头部的设计来实现并发转移过程。这种设计策略不仅简化了实现过程,同时也确保了垃圾收集器在高并发环境下的稳定运行。
  • ShenandoahGC目前存在两个主要版本:1.0版本和2.0版本。其中,1.0版本被集成在JDK8和JDK11中,而自后续版本的JDK起,均采用了更为先进和稳定的2.0版本。这种版本迭代不仅反映了技术的不断进步,也确保了ShenandoahGC能够持续适应和满足不断变化的应用需求。

二、ShenandoahGC 1.0版本

在ShenandoahGC的1.0版本中,为了支持其并发转移机制,每个对象的前8个字节被扩展,增加了一个前向指针(Forwarding Pointer)。这个前向指针的作用是指向转移之后的对象;如果转移尚未完成,它将指向对象本身。

image.gif

在转移阶段进行时,转移前的对象和转移后的对象会同时存在于内存中。当应用程序线程尝试访问这些数据时,ShenandoahGC会利用读前屏障(Read Barrier)机制,通过前向指针定位到转移后的对象,并读取该对象的数据。

image.gif

对于写入操作,ShenandoahGC采用了写前屏障(Write Barrier)。在写入数据前,写前屏障会检查对象头部的Mark Word中的GC状态。如果GC状态为0,表示当前没有垃圾回收过程正在进行,线程可以直接进行写入操作。如果GC状态不为0,则根据状态值确定当前垃圾回收的具体阶段,并可能要求用户线程执行与垃圾回收相关的任务。

然而,1.0版本的设计也存在一些显著的缺点:

  • 内存占用增加:由于每个对象都需要额外的8个字节来存储前向指针,这导致整体对象内存占用显著增加,通常会增加5%到10%的空间开销。
  • 读屏障性能开销:在读前屏障中加入了复杂的指令处理逻辑,这可能会增加处理器的负担,从而影响应用程序的整体性能。

三、ShenandoahGC 2.0版本

为了解决这些问题,ShenandoahGC的2.0版本对前向指针的位置进行了优化,仅在转移阶段将其临时放入Mark Word中,从而减少了内存占用和读屏障的性能开销。这种改进使得ShenandoahGC在保持高效垃圾收集的同时,也更好地适应了不同的应用场景。

image.gif

四、ShenandoahGC执行流程

image.gif

  • 初始标记(STW)阶段:在这一阶段,所有的用户线程都会被暂停。ShenandoahGC会标记所有由Gc Roots直接引用的对象为存活状态。由于此阶段涉及的对象数量相对较少,因此造成的停顿时间通常非常短暂,从而最大限度地减少了应用程序的暂停时间。
  • 并发标记阶段:此阶段是与用户线程并发执行的,即垃圾收集器与用户线程同时运行。在这个阶段,ShenandoahGC会遍历堆上的所有对象,通过跟踪对象的引用关系,标记出所有可达的存活对象。为了加速这一过程,用户线程也会协助进行对象的标记工作。
  • 标记结束(STW)阶段:当并发标记阶段完成后,会进入另一个短暂的STW事件。这一阶段主要用于进行一些整理性的工作,例如处理那些在并发标记阶段未被标记的对象(即被认定为垃圾的对象),并为下一个阶段(并发转移)做好准备。
  • 并发转移阶段:此阶段同样是与用户线程并发执行的。在这个阶段,ShenandoahGC会将标记为存活的对象从旧的内存区域转移到新的内存区域中。这样做的好处是可以减少内存碎片,并提高未来垃圾收集的效率。
  • 并发重映射阶段:最后一个阶段是并发重映射。在这个阶段,ShenandoahGC会遍历所有的引用,将那些原本指向旧对象的引用更新为指向新对象。这样做可以确保应用程序在继续执行时,能够正确地访问到已经被移动的对象。

通过上述五个阶段的协同工作,ShenandoahGC能够在保持低延迟的同时,有效地管理内存并进行垃圾回收。

并发转移阶段的并发问题

在并发转移阶段,ShenandoahGC面临一个关键的并发问题。当用户线程协助进行对象转移的同时,ShenandoahGC线程也可能发现同一个对象需要被复制。在这种情况下,为了确保数据的一致性和完整性,ShenandoahGC会尝试使用类似比较并交换(CAS, Compare-And-Swap)的机制来写入前向指针。CAS是一种原子操作,它允许线程在写入共享数据之前先检查该数据的当前值。只有当当前值与预期值相匹配时,写入操作才会执行。这确保了只有一个线程能够成功修改前向指针,从而避免了并发冲突。如果CAS操作失败,即当前值与预期值不匹配,那么执行CAS操作的线程会放弃当前的转移操作,并允许其他线程尝试执行。

image.gif

通过这种机制,ShenandoahGC在并发转移阶段能够确保数据的一致性和完整性,同时保持高并发性能。它允许用户线程和垃圾收集线程同时工作,从而提高了整体的系统吞吐量。


总结

JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了ShenandoahGC、ShenandoahGC 1.0版本、ShenandoahGC 2.0版本、ShenandoahGC执行流程等内容,希望对大家有所帮助。

相关文章
|
2月前
|
存储 监控 算法
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程 ?
尼恩提示: G1垃圾回收 原理非常重要, 是面试的重点, 大家一定要好好掌握
美团面试:说说 G1垃圾回收 底层原理?说说你 JVM 调优的过程  ?
|
2月前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。
|
2月前
|
存储 监控 算法
JVM调优深度剖析:内存模型、垃圾收集、工具与实战
【10月更文挑战第9天】在Java开发领域,Java虚拟机(JVM)的性能调优是构建高性能、高并发系统不可或缺的一部分。作为一名资深架构师,深入理解JVM的内存模型、垃圾收集机制、调优工具及其实现原理,对于提升系统的整体性能和稳定性至关重要。本文将深入探讨这些内容,并提供针对单机几十万并发系统的JVM调优策略和Java代码示例。
55 2
|
2月前
|
前端开发 Java 应用服务中间件
JVM进阶调优系列(1)类加载器原理一文讲透
本文详细介绍了JVM类加载机制。首先解释了类加载器的概念及其工作原理,接着阐述了四种类型的类加载器:启动类加载器、扩展类加载器、应用类加载器及用户自定义类加载器。文中重点讲解了双亲委派机制,包括其优点和缺点,并探讨了打破这一机制的方法。最后,通过Tomcat的实际应用示例,展示了如何通过自定义类加载器打破双亲委派机制,实现应用间的隔离。
|
5月前
|
存储 算法 安全
(八)JVM成神路之GC分区篇:G1、ZGC、ShenandoahGC高性能收集器深入剖析
在《GC分代篇》中,我们曾对JVM中的分代GC收集器进行了全面阐述,而在本章中重点则是对JDK后续新版本中研发推出的高性能收集器进行深入剖析。
183 12
|
5月前
|
运维 监控 Java
(十)JVM成神路之线上故障排查、性能监控工具分析及各线上问题排错实战
经过前述九章的JVM知识学习后,咱们对于JVM的整体知识体系已经有了全面的认知。但前面的章节中,更多的是停留在理论上进行阐述,而本章节中则更多的会分析JVM的实战操作。
120 1
|
5月前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
209 10
|
4月前
|
存储 监控 算法
深入解析JVM内部结构及GC机制的实战应用
深入解析JVM内部结构及GC机制的实战应用
|
5月前
|
存储 监控 Java
揭秘Java虚拟机:探索JVM的工作原理与性能优化
本文深入探讨了Java虚拟机(JVM)的核心机制,从类加载到垃圾回收,再到即时编译技术,揭示了这些复杂过程如何共同作用于Java程序的性能表现。通过分析现代JVM的内存管理策略和性能监控工具,文章提供了实用的调优建议,帮助开发者有效提升Java应用的性能。
81 3
|
5月前
|
存储 监控 安全
深入理解Java虚拟机(JVM)原理
深入理解Java虚拟机(JVM)原理