当前位置:Java -> Java 并行 GC 调优
并行垃圾回收器(Parallel GC)是JVM中最早引入的垃圾回收算法之一,旨在充分利用现代多核系统的处理能力。Parallel GC旨在通过利用多个线程并行执行垃圾回收来减少GC暂停的影响。在本文中,我们将专注于并行GC调优的领域。然而,如果您想了解更多垃圾回收调优的基础知识,您可以观看这个 JAX London会议讲座。
如果您的应用程序具有以下任意一个需求,您可以考虑使用Parallel GC:
要明确配置您的应用程序以使用Parallel GC,您可以在启动Java应用程序时传递以下参数:
-XX:+UseParallelGC
这个JVM参数指示JVM使用Parallel GC算法进行垃圾回收。但是,请注意,如果您没有明确指定垃圾回收算法,在Java 8之前的所有服务器类JVM中,默认的垃圾收集器设置为Parallel GC。
在Java Parallel GC调优领域,有一些关键的JVM参数可以控制垃圾回收过程的关键方面。我们将这些JVM参数分为三个类别:
a. 堆和代大小参数
b. 基于目标的调优参数
c. 各种参数
让我们进入细节:
Parallel Collector的垃圾回收(GC)调优涉及在整个堆的大小和Young和Old代大小之间实现微妙的平衡。虽然较大的堆通常可以提高吞吐量,但也会导致GC期间的暂停时间更长。因此,找到堆和代大小的最佳值变得至关重要。在本节中,我们将探讨关键的JVM参数,这些参数允许调整堆大小和代大小以实现高效的GC配置。
-Xmx
: 此参数设置最大堆大小,为内存分配建立了上限。通过精心选择-Xmx的合适值,开发人员可以控制整体堆大小,达到内存可用性和GC性能之间的平衡。-XX:NewSize
和 -XX:MaxNewSize
或 -XX:NewRatio
: 这些参数管理Young代的大小,其中分配新对象。-XX:NewSize
设置初始大小,而-XX:MaxNewSize
或-XX:NewRatio
控制Young和Old代之间的上限或比例。调整这些值允许对Young代的大小和比例进行微调。这里有一家大型技术公司的成功故事,他们减小了Young代的大小,整体应用程序响应时间有了显著的改善。-XX:YoungGenerationSizeIncrement
和 -XX:TenuredGenerationSizeIncrement
: 这些参数定义了Young和Tenured代的大小增量。Young和Tenured代的大小增量是内存分配和垃圾回收行为的关键因素。增长和缩减以不同的速率进行。默认情况下,代以20%的增量增长,以5%的增量缩减。增长的百分比由命令行选项-XX:YoungGenerationSizeIncrement=<Y>
和-XX:TenuredGenerationSizeIncrement=<T>
控制。-XX:AdaptiveSizeDecrementScaleFactor
: 此参数确定了在收缩期间减小代大小时使用的比例系数。代收缩的百分比通过命令行标志-XX:AdaptiveSizeDecrementScaleFactor=<D>
进行调整。如果增长增量是X百分比,那么收缩的减量是X/D百分比。为了实现垃圾回收的最佳性能,控制GC暂停时间并优化GC吞吐量(表示用于垃圾回收的时间与应用程序执行时间的比例)至关重要。在本节中,我们将探讨支持基于目标的调优的关键JVM参数,使开发人员能够微调垃圾回收的这些方面。
-XX:MaxGCPauseMillis
: 此参数使开发人员能够指定垃圾回收的最大暂停时间(以毫秒为单位)。通过设置适当的值,开发人员可以调节GC暂停的持续时间,确保其保持在可接受的范围内。-XX:GCTimeRatio
: 这个参数使用公式1 / (1 + N)设置垃圾回收时间与应用程序时间的比率,其中N是正整数值。该参数的目的是定义用于优化GC吞吐量的时间分配比率,以便垃圾回收与应用程序执行的时间。例如,假设-XX:GCTimeRatio=19
。使用该公式,目标是分配总时间的1/20或5%给垃圾回收。这意味着对于每20个单位的时间(例如,毫秒)的组合垃圾回收和应用执行时间,大约有1个单位的时间分配给垃圾回收,而剩下的19个单位将用于应用执行。默认值为99,设置垃圾回收目标为1%的时间。-XX:GCTimePercentage
: 此参数允许开发人员直接指定分配给垃圾回收的时间百分比,与应用执行时间(即,GC吞吐量)相关。例如,设置‘-XX:GCTimePercentage=5’
表示将总时间的5%分配给垃圾回收,其余95%专用于应用执行。注: 开发人员可以选择使用‘-XX:GCTimeRatio‘
或‘-XX:GCTimePercentage‘
作为彼此的替代选择。这两个选项都提供了表达对垃圾回收所需时间分配的灵活性。我更喜欢使用‘-XX:GCTimePercentage’
而不是‘-XX:GCTimeRatio’
,因为它更容易理解。
除了之前讨论过的JVM参数之外,还有一些其他参数可用于调整并优化并行GC算法。让我们来探讨一下。
-XX:ParallelGCThreads
:这个参数允许开发人员指定在并行GC算法中用于垃圾回收的线程数。通过根据可用CPU核心设置适当的值,开发人员可以通过利用多核系统的处理能力来优化吞吐量。重要的是要保持平衡,避免线程过少或过多,因为这两种情况都可能导致性能不佳。
-XX:-UseAdaptiveSizePolicy
:默认情况下,‘UseAdaptiveSizePolicy’
选项已启用,可以根据应用程序的行为和内存需求动态调整年轻代和老年代的大小。然而,这种动态调整可能导致频繁的“Full GC – Ergonomics”垃圾回收和增加的GC暂停时间。为了缓解这个问题,我们可以传递-XX:-UseAdaptiveSizePolicy
参数来禁用调整大小并减少GC暂停时间。这里是一个关于这个JVM参数的真实世界示例和讨论。
通过分析GC日志来研究并行GC的性能特征是最佳实践。GC日志包含有关垃圾回收事件、内存使用和其他相关指标的详细信息。有几种可用的工具可以帮助分析GC日志,例如GCeasy、IBM GC和Memory Visualizer、HP Jmeter和Google Garbage Cat。通过使用这些工具,您可以可视化内存分配模式,识别潜在瓶颈,评估垃圾回收的效率。这有助于在优化性能时做出明智的决策并进行多线程GC。
总之,通过调整JVM参数微调并行GC算法以及研究其行为,开发人员可以实现高效的垃圾回收和改进Java应用程序的性能。通过调整参数如堆大小、代大小和基于目标的调整参数,开发人员可以优化垃圾回收过程。根据特定要求的持续监控和调整对于保持最佳性能至关重要。通过优化并行GC调整,开发人员可以最大程度地管理内存,减少GC暂停,并释放Java应用程序的全部潜力。
推荐阅读: 比亚迪入职经历分享
本文链接: Java 并行 GC 调优