【Java 8 GC 调优】有哪些 GC
此节主要与 串行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 提高总吞吐量(多处理器硬件上)