ZGC介绍

作者: 自天佑之吉无不利 | 来源:发表于2023-09-25 22:24 被阅读0次

    ZGC 是一种专为高并发和大内存应用场景设计的垃圾收集器,具备可伸缩性、低停顿时间、大堆内存支持和易用性等特点。

    ZGC VS G1

    G1 在回收过程中存在两个基本阶段:标记阶段和清除阶段。

    在标记阶段,GC 会找出所有需要被清除的对象。然后在清除阶段,GC 会清除那些已经被标记的对象。这个过程所有的应用线程都需要暂停。然而在 ZGC 中情况有所改变。ZGC 使用了一种叫做“并行”的方式来进行垃圾收集,这解决了 G1 必须停顿的问题。

    并行处理意味着 ZGC 可以同时进行标记和清除这两个动作,而不是像 G1 和 CMS 那样等待标记阶段完成后再进行清除。这样,ZGC 可以在可预见的暂停时间内更好地处理大型数据集。

    ZGC 的最佳实践

    作为新型的 GC,如何更好地使用 ZGC?我整理了 ZGC 使用的最佳实践,你可以参考下。

    分配合适的内存

    根据应用程序的内存需求和系统资源,使用 -Xmx 参数设置合适的最大堆内存大小。确保为应用程序提供足够的内存空间,避免频繁地垃圾收集导致性能下降。

    调整并发线程

    根据应用程序的性能需求和系统配置,使用 -XX:ConcGCThreads 和 -XX:ParallelGCThreads 参数调整并发 GC 线程和并行 GC 线程的数量。适当增加并行线程的数量可以加快标记和整理操作的速度,提高垃圾收集的效率。

    注意资源限制

    如果应用程序运行在有限的硬件资源上,如 CPU 核心数、内存容量等,确保不超过系统的限制。避免过度配置并发和并行线程的数量,以免竞争资源导致性能下降。

    启用垃圾收集日志

    在调试和优化阶段,启用垃圾收集日志,使用 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xlog:gc* 参数,以便查看 GC 日志,了解内存分配和回收情况,并识别潜在的性能问题。

    监控和调优

    使用合适的监控工具监视应用程序的内存使用和垃圾收集性能。根据监控数据进行调优,例如调整垃圾收集相关参数或进行代码优化,提高应用程序的性能和可伸缩性。

    ZGC 适用于具有大内存需求和对低停顿时间敏感的应用程序,例如大型数据库、内存缓存和大数据处理等。根据具体的应用程序和系统配置进行实验和性能测试,以找到最适合的参数和配置。在生产环境中使用 ZGC 的时候,你还要确保使用 Java 11 或更高版本的 JDK。

    ZGC 在战略上沿用了前几代垃圾回收器的算法策略,采用并发标记和并发清理的思路,在战术上通过颜色指针等技术达到更理想的并发清理。但 ZGC 同样不是银弹,它也有自身的优缺点。

    它的优势在于一旦一个内存区域的活跃对象被移走,这个区域就可以立即得到清空和重复利用,不用等待所有针对这个区域的引用修正完成;颜色指针降低了内存屏障的使用频次,只使用了读取屏障;颜色指针显示出高扩展能力,可以记录与对象标记、重新定位相关的信息,以提高性能。

    它的劣势在于对快速分配的对象分配速度存在一定的约束,长时间保持高分配速度会导致全并发收集周期过长,且回收的内存空间小于并发生成的浮动垃圾占据的空间,导致堆内可移动的剩余空间逐步减少;吞吐量低于 G1,尤其是在堆比较小的情况下,ZGC 的性能损失可能达到 5% 到 15%。

    所以说,ZGC 并不是一个全新的垃圾回收器,而是在前几代垃圾回收器的基础上进行了优化。它的出色表现有可能改变未来的编程方式,垃圾回收器喜欢不可变对象,因为它们更容易处理。有了 ZGC 强大的回收能力,我们不用再担心内存和垃圾回收的限制,可以大胆地使用不可变对象进行代码编写。

    此文章为9月Day24学习笔记,内容来源于极客时间《云时代JVM实战 》,强烈推荐该课程

    相关文章

      网友评论

          本文标题:ZGC介绍

          本文链接:https://www.haomeiwen.com/subject/jxvcbdtx.html