关于G1垃圾收集器

选择收集器

除非您的应用程序有非常严格的暂停时间要求,否则请先运行您的应用程序并允许VM选择收集器。如有必要,请调整堆大小以提高性能。如果性能仍然不能达到您的目标,请使用以下准则作为选择收集器的起点。

  • 如果应用程序的数据集较小(最大约100 MB),则

    使用选项选择串行收集器-XX:+UseSerialGC

  • 如果应用程序将在单个处理器上运行,并且没有暂停时间要求,则让VM选择收集器,或使用选项选择串行收集器-XX:+UseSerialGC

  • 如果(a)峰值应用程序性能是第一要务,并且(b)没有暂停时间要求或可接受的暂停时间为1秒或更长时间,则让VM选择收集器,或使用来选择并行收集器-XX:+UseParallelGC

  • 如果响应时间比整体吞吐量更重要,并且垃圾收集暂停时间必须保持小于1秒,那么请使用-XX:+UseConcMarkSweepGC或选择并发收集器-XX:+UseG1GC

这些准则仅提供选择收集器的起点,因为性能取决于堆的大小,应用程序维护的实时数据量以及可用处理器的数量和速度。暂停时间对这些因素特别敏感,因此前面提到的1秒阈值仅是近似值:在许多数据大小和硬件组合上,并行收集器的暂停时间将超过1秒。相反,在某些组合上,并发收集器可能无法将暂停时间保持在1秒以内。

如果推荐的收集器未达到所需的性能,请首先尝试调整堆和世代大小以满足所需的目标。如果性能仍然不足,请尝试使用其他收集器:使用并发收集器减少暂停时间,并使用并行收集器增加多处理器硬件上的总体吞吐量。


 

 

G1收集器通过多种技术实现了高性能和暂停时间目标。

堆被划分为一组大小相等的堆区域,每个区域都有一个连续的虚拟内存范围。G1执行并发全局标记阶段,以确定整个堆中对象的活动性。标记阶段完成后,G1知道哪些区域大部分为空。它首先收集在这些区域中,通常会产生大量的自由空间。这就是为什么这种垃圾收集方法称为“垃圾优先”的原因。顾名思义,G1将其收集和压缩活动集中在可能充满可回收对象(即垃圾)的堆区域。G1使用暂停预测模型来满足用户定义的暂停时间目标,并根据指定的暂停时间目标选择要收集的区域数。

由G1标识为可回收的成熟区域是使用疏散收集的垃圾。G1将对象从堆的一个或多个区域复制到堆上的单个区域,并在此过程中压缩并释放内存。撤离是在多处理器上并行执行的,以减少暂停时间并增加吞吐量。因此,对于每个垃圾收集,G1都在用户定义的暂停时间内连续工作以减少碎片。这超出了前面两种方法的能力。CMS(并发标记扫描)垃圾回收不会进行压缩。ParallelOld垃圾回收仅执行整个堆压缩,这导致相当长的暂停时间。

重要的是要注意,G1不是实时收集器。它很有可能达到设定的暂停时间目标,但并非绝对确定。G1根据先前收集的数据,估算在用户指定的目标时间内可以收集多少个区域。因此,收集器具有收集区域成本的合理准确的模型,并且收集器使用此模型来确定要收集哪些和多少个区域,同时保持在暂停时间目标之内。

G1的推荐用例

G1的首要重点是为运行需要大堆且GC延迟有限的应用程序的用户提供解决方案。这意味着堆大小约为6GB或更大,并且稳定且可预测的暂停时间低于0.5秒。

如果当前具有CMS或ParallelOld垃圾收集器的应用程序具有以下一个或多个特征,则将其切换到G1很有用。

  • 超过50%的Java堆被实时数据占用。
  • 对象分配率或提升率差异很大。
  • 不必要的长时间垃圾收集或压缩暂停(长于0.5到1秒)

    重要默认值

    G1 GC是具有默认设置的自适应垃圾收集器,可使其无需修改即可高效工作。这是重要选项及其默认值的列表。该列表适用于最新的Java HotSpot VM(内部版本24)。您可以通过在JVM命令行上输入以下具有更改的设置的选项来适应和调整G1 GC以满足应用程序的性能需求。

    • 选项和默认值 选项

      -XX:G1HeapRegionSize=n

      设置G1区域的大小。该值为2的幂,范围为1 MB至32 MB。目标是基于最小的Java堆大小具有大约2048个区域。

      -XX:MaxGCPauseMillis=200

      为所需的最大暂停时间设置目标值。默认值为200毫秒。指定的值不适合您的堆大小。

      -XX:G1NewSizePercent=5

      设置要用作年轻代大小的最小值的堆百分比。默认值为Java堆的5%。

      这是一个实验性标志。有关示例,请参见如何解锁实验性VM标志。此设置代替-XX:DefaultMinNewGenPercent设置。

      -XX:G1MaxNewSizePercent=60

      设置堆大小的百分比,以用作年轻代大小的最大值。默认值为Java堆的60%。

      这是一个实验性标志。有关示例,请参见如何解锁实验性VM标志。此设置代替-XX:DefaultMaxNewGenPercent设置。

      -XX:ParallelGCThreads=n

      设置STW工作线程的值。将的值设置n为逻辑处理器的数量。的值与n逻辑处理器的数量相同,最多为8。

      如果逻辑处理器多于八个,则将n的值设置为逻辑处理器的大约5/8。除较大的SPARC系统外,这在大多数情况下都有效,其中n的值约为逻辑处理器的5/16。

      -XX:ConcGCThreads=n

      设置平行标记线的数量。设置n为并行垃圾回收线程数(ParallelGCThreads)的大约1/4。

      -XX:InitiatingHeapOccupancyPercent=45

      设置触发标记周期的Java堆占用阈值。默认占用率是整个Java堆的45%。

      -XX:G1MixedGCLiveThresholdPercent=85

      设置要包含在混合垃圾收集周期中的旧区域的占用阈值。默认占用率为85%。

      这是一个实验性标志。有关示例,请参见如何解锁实验性VM标志。此设置代替-XX:G1OldCSetRegionLiveThresholdPercent设置。

      -XX:G1HeapWastePercent=5

      设置您愿意浪费的堆百分比。当可回收百分比小于堆垃圾百分比时,Java HotSpot VM不会启动混合垃圾回收周期。默认值为5%。

      -XX:G1MixedGCCountTarget=8

      设置标记周期后混合垃圾回收的目标数量,以收集最多包含G1MixedGCLIveThresholdPercent实时数据的旧区域。默认值为8个混合垃圾回收。混合馆藏的目标是在此目标数量之内。

      -XX:G1OldCSetRegionThresholdPercent=10

      设置在混合垃圾收集周期中要收集的旧区域数的上限。缺省值为Java堆的10%。

      -XX:G1ReservePercent=10

      设置保留内存的百分比以使其保持空闲状态,以减少空间溢出的风险。默认值为10%。当增加或减少百分比时,请确保将总Java堆调整为相同的数量。

       

       

      -XX:G1HeapRegionSize=n

      设置G1区域的大小。该值为2的幂,范围为1MB至32MB。目标是基于最小的Java堆大小具有大约2048个区域。

    • -XX:MaxGCPauseMillis=200

      为所需的最大暂停时间设置目标值。默认值为200毫秒。指定的值不适合您的堆大小。

    • -XX:G1NewSizePercent=5

      设置要用作年轻代大小的最小值的堆百分比。默认值为Java堆的5%。这是一个实验性标志。有关示例,请参见“ 如何解锁实验性VM标志 ”。此设置代替-XX:DefaultMinNewGenPercent设置。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:G1MaxNewSizePercent=60

      设置堆大小的百分比,以用作年轻代大小的最大值。默认值为Java堆的60%。这是一个实验性标志。有关示例,请参见“ 如何解锁实验性VM标志 ”。此设置代替-XX:DefaultMaxNewGenPercent设置。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:ParallelGCThreads=n

      设置STW工作线程的值。将n的值设置为逻辑处理器的数量。的值与n逻辑处理器的数量相同,最多为8。

      如果逻辑处理器多于八个,则将的值设置为逻辑处理器的n大约5/8。在大多数情况下,这n是可行的,但大型SPARC系统的值可能约为逻辑处理器的5/16。

    • -XX:ConcGCThreads=n

      设置平行标记线的数量。设置n为并行垃圾回收线程数(ParallelGCThreads)的大约1/4 。

    • -XX:InitiatingHeapOccupancyPercent=45

      设置触发标记周期的Java堆占用阈值。默认占用率是整个Java堆的45%。

    • -XX:G1MixedGCLiveThresholdPercent=65

      设置要包含在混合垃圾收集周期中的旧区域的占用阈值。默认占用率为65%。这是一个实验性标志。有关示例,请参见“ 如何解锁实验性VM标志 ”。此设置代替-XX:G1OldCSetRegionLiveThresholdPercent设置。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:G1HeapWastePercent=10

      设置您愿意浪费的堆百分比。当可回收百分比小于堆垃圾百分比时,Java HotSpot VM不会启动混合垃圾回收周期。默认值为10%。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:G1MixedGCCountTarget=8

      设置标记周期后混合垃圾回收的目标数量,以收集最多包含G1MixedGCLIveThresholdPercent实时数据的旧区域。默认值为8个混合垃圾回收。混合馆藏的目标是在此目标数量之内。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:G1OldCSetRegionThresholdPercent=10

      设置在混合垃圾收集周期中要收集的旧区域数的上限。缺省值为Java堆的10%。此设置在Java HotSpot VM(内部版本23)中不可用。

    • -XX:G1ReservePercent=10

      设置保留内存的百分比以使其保持空闲状态,以减少空间溢出的风险。默认值为10%。当增加或减少百分比时,请确保将总Java堆调整为相同的数量。此设置在Java HotSpot VM(内部版本23)中不可用。

  • 最后,推荐常用的G1参数配置:

  •  -XX:+UseG1GC -Xms1536M -Xmx1536M -Xloggc:/home/gc-logs/XXXX-gc-%t.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCCause
     

你可能感兴趣的:(java)