[HotSpot 虚拟机垃圾收集调优指南-JavaSE11-笔记]-6-并行垃圾收集器

6 并行垃圾收集器

并行收集器(这里也称为吞吐量收集器)是类似于串行收集器的分代收集器。串行收集器并行收集器之间的主要区别在于并行收集器多个线程用于加速垃圾收集

并行收集器通过命令行选项启用 -XX:+UseParallelGC。默认情况下,使用此选项,Minor GC and Full GC 并行运行,以进一步减少垃圾收集开销。

6.1 并行收集器垃圾收集器线程数

在一台机器上如果有N硬件线程,如果N大于 8,并行收集器使用固定分数N作为垃圾收集器线程的数量,可能不太好理解接下来详细看下:

在具有一个处理器的主机上,由于并行执行(例如同步)所需的开销,并行收集器的性能可能不如串行收集器。但是,在运行具有中型到大型堆的应用程序时,它在具有两个处理器的计算机上的性能通常比串行收集器略胜一筹,并且当有两个以上处理器可用时,它的性能通常明显优于串行收集器

可以使用命令行选项控制垃圾收集器线程的数量 -XX:ParallelGCThreads=. 如果您使用命令行选项调整堆,则并行收集器获得良好性能所需的堆大小与串行收集器所需的堆大小相同。但是,启用并行收集器应该会使收集暂停时间更短。由于多个垃圾收集器线程正在参与一次Minor GC,因此由于在GC期间从年轻代到老年代的提升, 可能会产生一些碎片 。Minor GG收集中涉及的每个垃圾收集线程都会保留一部分老年代用于升级,将可用空间划分到这些“升级缓冲区”中会导致碎片效应减少垃圾收集器线程的数量增加老年代的大小减少这种碎片效应。

6.2 并行收集器行为的一些配置

可以指定最大垃圾回收暂停时间吞吐量占用空间(堆大小)。

最大垃圾收集暂停时间:最大暂停时间目标由命令行选项指定 -XX:MaxGCPauseMillis=N. 这被解释为暗示暂停时间N需要毫秒或更短的时间;默认情况下没有最大暂停时间目标如果指定了暂停时间目标,则调整堆大小和其他与垃圾收集相关的参数,以尝试使垃圾收集暂停时间短于指定值;但是,可能并不总能达到所需的暂停时间目标。这些调整可能会导致垃圾收集器降低应用程序的整体吞吐量。

吞吐量: 吞吐量目标是根据执行垃圾收集所花费的时间与在垃圾收集之外花费的时间(称为应用程序时间)来衡量的。目标由命令行选项指定**-XX:GCTimeRatio=N**,它将垃圾收集时间应用程序时间比率设置为1 / (1 + N).

例如,-XX:GCTimeRatio=19将目标设置为垃圾回收总时间的 1/20 或 5%。默认值为 99,导致垃圾回收时间的目标为 1%。

占用空间: 使用选项指定最大堆占用空间-XmxN . 此外,只要满足其他目标,收集器就有一个隐含的目标,即最小化堆的大小

6.3 并行收集器目标的优先级

目标是最大暂停时间目标吞吐量目标和最小占用空间目标,目标按以下顺序处理:

首先达到最大暂停时间目标。只有在满足之后吞吐量目标才会得到解决。同样,只有在前两个目标实现之后,才会考虑小占用空间目标

并行收集器生成大小调整
收集器保存的平均暂停时间等统计信息在每次收集结束时更新。

然后进行测试以确定目标是否已经实现,并对分代的规模进行任何必要的调整。例外是显式垃圾收集,例如,调用System.gc()在保持统计和调整分代规模方面被忽略。

分代大小的增长和缩小通过增量来完成的,增量是一代大小的固定百分比,以便分代朝着其期望的大小递增或递减。增长和收缩以不同的速度完成。默认情况下,分代以 20% 的增量增长,以 5% 的增量缩小增长的百分比由命令行选项控制 -XX:YoungGenerationSizeIncrement=Y对于年轻代和 -XX:TenuredGenerationSizeIncrement=T 为老年代。分代收缩的百分比由命令行标志调整 -XX:AdaptiveSizeDecrementScaleFactor=D. 如果增长增量是X%,那么收缩的减量为X/D%。

如果收集器决定在启动时增加一代,那么增量中会添加一个补充百分比。这种补充随着收缩的数量而衰减,没有长期的影响。补充的目的是提高启动性能。收缩百分比没有补充。

如果没有达到最大暂停时间目标,那么一次只缩小一代的大小。如果两代的停顿时间都在目标之上,那么停顿时间较大的代的规模首先缩小。

如果吞吐量目标没有得到满足,那么两代的大小都会增加。每个都根据其各自对总垃圾收集时间的贡献而增加​​。例如,如果年轻代的垃圾收集时间是总收集时间的 25%,如果年轻代的完全增量为 20%,那么年轻代将增加 5%。

并行收集器默认堆大小
除非在命令行中指定了初始和最大堆大小,否则它们是根据机器上的内存量计算的。默认的最大堆大小是物理内存的四分之一,而初始堆大小是物理内存的 1/64。分配给年轻代的最大空间量是总堆大小的三分之一

并行收集器初始和最大堆大小的规范
您可以使用选项**-Xms(初始堆大小)-Xmx(最大堆大小)**指定初始和最大堆大小。

如果您知道您的应用程序需要多少堆才能正常工作,那么您可以将-Xms和设置-Xmx为相同的值。如果您不知道,那么 JVM 将首先使用初始堆大小,然后增长 Java 堆,直到在堆使用和性能之间找到平衡。

其他参数和选项可能会影响这些默认值。要验证您的默认值,请使用该-XX:+PrintFlagsFinal选项并 -XX:MaxHeapSize在输出中查找。例如,在 Linux 上,您可以运行以下命令:

java -XX:+PrintFlagsFinal <GC options> -version | grep MaxHeapSize

过多的并行收集器时间和 OutOfMemoryError
如果在垃圾收集 (GC) 中花费的时间过多,则并行收集器会抛出OutOfMemoryError异常

如果超过 98% 的总时间花在垃圾收集上,而回收的堆不到 2% OutOfMemoryError,则抛出 , 此功能旨在防止应用程序长时间运行,同时由于堆太小而几乎没有进展或没有进展。-XX:-UseGCOverheadLimit如有必要,可以通过将选项添加到命令行 来禁用此功能。

技术咨询支持,可以扫描微信公众号进行回复咨询
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宋小生的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值