专栏导航
JVM工作原理与实战
RabbitMQ入门指南
从零开始了解大数据
目录
专栏导航
前言
一、垃圾回收器的技术演进
二、Shenandoah GC
三、ZGC
1.ZGC的版本更迭
2.ZGC的使用方法
3.ZGC的参数设置
4.ZGC的调优
四、ZGC与Shenandoah GC的性能差异与应用场景
总结
JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收器的技术演进、Shenandoah GC、ZGC等内容。
垃圾回收器分为年轻代和老年代,它们各自负责不同生命周期的对象的回收。
Serial垃圾回收器、SerialOld垃圾回收器、ParNew垃圾回收器、CMS垃圾回收器、Parallel Scavenge垃圾回收器、Parallel Old垃圾回收器、G1垃圾回收器的详细讲解可以查看之前的文章:
JVM工作原理与实战(二十六):堆的垃圾回收-垃圾回收器-CSDN博客文章浏览阅读1.2k次,点赞36次,收藏21次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了垃圾回收器、Serial垃圾回收器、SerialOld垃圾回收器、ParNew垃圾回收器、CMS垃圾回收器、Parallel Scavenge垃圾回收器、Parallel Old垃圾回收器等内容。https://blog.csdn.net/jiangyq_/article/details/135814251JVM工作原理与实战(二十七):堆的垃圾回收-G1垃圾回收器-CSDN博客文章浏览阅读1.5k次,点赞59次,收藏30次。JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了G1垃圾回收器、G1垃圾回收器的回收方式、G1垃圾回收器执行流程、垃圾回收器的选择等内容。https://blog.csdn.net/jiangyq_/article/details/135839716不同的垃圾回收器(Garbage Collectors)在设计时,其目标呈现出显著的多样性。这些目标包括提高内存管理效率、减少程序暂停时间、优化吞吐量等。
Shenandoah GC 是由Red Hat精心研发的一款低延迟垃圾收集器。其核心优势在于并发执行大部分垃圾收集工作,包括并发的整理过程,从而极大地减少了应用程序的暂停时间。此外,Shenandoah GC 使得堆大小对STW(Stop-The-World)时间的影响微乎其微,为现代高性能、低延迟的应用程序提供了理想的解决方案。
Shenandoah GC 的下载与构建:
鉴于Shenandoah GC仅包含在OpenJDK的特定版本中,且默认配置中并不包含,因此,用户需要手动进行构建或下载预构建的版本。
arch
命令或相关工具来确定系统架构。server
类型,它包含了所有垃圾收集器的功能,为生产环境提供了更全面的支持。release
级别。其他如fastdebug
, Slowdebug
, optimization
等级别则更适合于调试和优化目的。Shenandoah GC 的环境配置:
在使用Shenandoah GC之前,需要将OpenJDK的路径配置到系统的环境变量中。完成配置后,可以通过在命令行中运行java –version
命令来验证配置是否成功。如果命令能够正常返回Java版本信息,则说明环境配置成功。
Shenandoah GC 的使用:
在配置好OpenJDK环境并安装了Shenandoah GC后,可以通过在启动Java程序时添加特定的JVM参数来使用Shenandoah GC。以下是一些关键参数:
-XX:+UseShenandoahGC
:启用Shenandoah垃圾收集器。-Xlog:gc
:打印GC日志,帮助监控和分析垃圾收集活动的性能和行为。这些参数可以在启动Java程序时使用java
命令的-XX
选项进行指定。例如:
# 启动一个Java应用程序,并使用Shenandoah GC进行内存管理,同时打印GC日志
java -XX:+UseShenandoahGC -Xlog:gc -jar application.jar
ZGC(Z Garbage Collector)是Java中一种高效、可扩展且低延迟的垃圾回收器。其核心优势在于能够在垃圾回收过程中将Stop-The-World(STW)时间控制在极低的范围内,通常不超过一毫秒,这使得ZGC非常适合需要低延迟和高吞吐量的应用场景。此外,ZGC支持广泛的堆大小配置,从几百兆到高达16TB,且堆大小的变化对STW时间的影响微乎其微。
通过降低垃圾回收过程中的停顿时间,ZGC能够显著降低应用程序接口的最大响应时间,从而大幅提升用户体验。然而,值得注意的是,ZGC在追求低延迟的同时,可能会牺牲一部分吞吐量。因此,如果Java服务对QPS(每秒查询次数)有较高要求,那么G1垃圾回收器可能是一个更合适的选择。
ZGC在Oracle JDK和OpenJDK中均得到支持,同时阿里的DragonWell龙井JDK也提供了对ZGC的优化支持,这是基于OpenJDK 11版本的定制化改进。为了获得更佳的性能和体验,建议使用JDK 17或更高版本,这些版本在延迟优化和自动配置方面有着显著的提升,无需用户手动配置并行线程数。启用ZGC可以通过添加相应的JVM参数实现。对于分代收集,可以使用-XX:+UseZGC -XX:+ZGenerational
参数启用;而对于非分代收集,则只需使用-XX:+UseZGC
参数即可。
# 分代收集
-XX:+UseZGC -XX:+ZGenerational
# 非分代收集
-XX:+UseZGC
ZGC在设计上采用了自适应策略,能够根据运行时的实际情况自动调整大部分参数,从而最小化用户需要手动配置的参数数量。例如,ZGC会自动设置年轻代的大小,无需用户通过-Xmn
参数进行配置;同时,自动晋升阈值(决定对象在复制过程中存活多少次才会被移动到老年代)也无需用户通过-XX:TenuringThreshold
参数进行设置。在JDK 17及更高版本中,ZGC还支持自动配置并行线程数,无需用户通过-XX:ConcGCThreads
参数进行手动设置。
尽管ZGC能够自动调整大部分参数,但仍有一些关键参数需要用户根据实际情况进行设置。其中最重要的是-Xmx
参数,它用于指定最大堆内存大小。由于ZGC在运行过程中会使用一部分内存来处理垃圾回收任务,因此用户需要确保堆中有足够的空间以满足应用程序的需求。-Xmx
的具体设置值应根据对象分配的速度和测试情况来决定。
除了必须设置的参数外,ZGC还提供了一些可选参数供用户进行更细粒度的配置。例如,-XX:SoftMaxHeapSize
参数允许用户指定一个软性最大堆内存大小。ZGC会尽量保证堆内存的使用量不超过这个值,从而在内存使用量接近这个阈值时尽早触发垃圾回收。然而需要注意的是,即使设置了-XX:SoftMaxHeapSize
参数,堆内存的使用量仍有可能超过这个值。
为了进一步提升ZGC的性能和吞吐量,用户可以考虑使用Linux的Huge Page大页技术进行优化。通过利用大页技术,ZGC能够降低内存管理的开销并提升垃圾回收的效率。然而需要注意的是,安装和配置Huge Page需要root权限,因此ZGC默认并未开启此功能。
要使用Huge Page技术优化ZGC性能,用户可以按照以下步骤进行操作:
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
文件来实现。例如,可以使用命令echo 9216 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
来配置系统的大页池。-XX:+UseLargePages
参数以启用Huge Page技术。这将使ZGC能够利用配置好的大页来提升性能和吞吐量。通过以上步骤,用户可以利用Linux的Huge Page技术进一步优化ZGC的性能和吞吐量,从而满足更高要求的应用场景需求。
ZGC与Shenandoah GC均致力于实现低延迟的垃圾回收,以满足不同应用场景的需求。
设计与目标:两者均设计有高效的并行回收机制,在垃圾回收过程中会利用专门的垃圾回收线程来执行回收任务,从而有效管理内存并减少应用程序的停顿时间。
使用场景差异:
ZGC和Shenandoah GC在不同的内存条件下均有其独特的优势。根据实际应用场景的内存需求,可以灵活选择适合的垃圾回收器,以优化系统性能并提升用户体验。
JVM是Java程序的运行环境,负责字节码解释、内存管理、安全保障、多线程支持、性能监控和跨平台运行。本文主要介绍了垃圾回收器的技术演进、Shenandoah GC、ZGC等内容,希望对大家有所帮助。