欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java 8 GC 调优】有哪些 GC

程序员文章站 2022-05-30 10:49:54
...

此节主要与 串行GC 相关。
 

3类 GC

Hotspot 有 3种 不同类型的 GC,每个 GC 都有不同的性能特征。

 

串行GC

串行GC 使用单线程执行所有垃圾回收工作。因为没有线程间通信开销,所以相对而言比较高效。
尽管它在多处理器机器上,对小数据集(上限100MB左右)的应用程序很有效,但它最适合单处理器的机器。因为它不能利用多处理器硬件的优势。
在某些硬件和操作系统上,串行GC 是默认选项。也可以通过 -XX:+UseSerialGC 显式启用。

 

并行GC(吞吐量GC)

并行GC 也称为 吞吐量GC。它以并行的方式执行 Minor GC,可以显著减少垃圾收集的开销。
它适用于 运行在多处理器或多线程硬件上的 中大型数据集 应用程序。
在某些硬件和操作系统上,并行GC 是默认选项。也可以通过 -XX:+UseParallelGC 显式启用。
 

并行压缩(compact)

“并行压缩” 这项特性使得 并行GC 能并行执行 Major GC。
如果没有“并行压缩”,那么将使用单线程执行 Major GC,这会显著限制可伸缩性。
如果指定了 -XX:+UseParallelGC,那么默认会启用“并行压缩”。可以通过 -XX:-UseParallelOldGC 关闭“并行压缩”特性。

 

并发GC(Mostly Concurrent GC)

并发GC(Mostly Concurrent Collector) 会并发执行大部分工作。
如,当应用程序仍在运行的时候,执行GC(与应用程序的“业务处理”是并发关系)。这样可以缩短 GC 的暂停时间
它是为 中大型数据集响应时间比总吞吐量更重要 的应用程序设计的。因为用于最小化暂停时间的技术 会降低应用程序的性能
HotSpot 提供了 2个 并发GC (《并发GC》)。可通过 -XX:+UseConcMarkSweepGC 启用 CMS,或 -XX:+UseG1GC 启用 G1

 

选择 GC

除非相当严格的暂停时间要求,否则 先运行应用程序 且允许 JVM 自行选择 GC。
如有必要,可以调整堆大小 以提高性能。
如果性能仍然无法满足目标,则使用以下准则作为选择 GC 的起点。
 

  • 如果应用程序的数据集较小(上限 100MB 左右),那么使用 串行GC(-XX:+UseSerialGC)。
  • 如果应用程序运行在单处理器上,且没有暂停时间的要求,那么可以让 JVM 自行选择GC,或指定 串行GC(-XX:+UseSerialGC)
  • 如果 应用程序的峰值性能 是第一优先级,且没有暂停时间的要求,或者可以接受1秒或更长时间的暂停,那么可以让 JVM 自行选择GC,或指定 并行GC (-XX:+UseParallelGC)。
  • 如果响应时间比总吞吐量更重要,且GC导致的暂停时间必须小于 1 秒,那么可以指定一个 并发GC(-XX:+UseConcMarkSweepGC 或 -XX:+UseG1GC)。

这些准则仅提供了选择GC的起点。因为性能取决于 堆的容量、存活数据量、处理器的数量和速度。暂停时间 对这些因素特别敏感,所以前面提到的 1秒 阈值只是近似值。在许多不同数据集与硬件的组合中,并行GC 的暂停时间会超过 1秒。相反,并发GC 只在部分组合中会暂停超过1秒。
 

如果上述建议的GC未达到性能要求,可先尝试调整堆大小。 如果性能仍然不足,再尝试其他GC:

  • 并发GC 减少暂停时间
  • 并行GC 提高总吞吐量(多处理器硬件上)