并行GC,也称为 吞吐量GC,是与 串行GC 类似的 分代GC。其主要区别在于,用多个线程加快垃圾收集速度。
可通过命令行选项 -XX:+UseParallelGC 启用 并行GC。默认情况下,使用此选项后,Minor 和 Major GC 都是并行执行,以进一步减少垃圾收集的开销。
在具有超过8个硬件线程的机器上,并行GC 会使用固定占比的数量作为GC线程数。
硬件线程数较大时,该占比为 5/8 。硬件线程数小于8时,GC线程数就是硬件线程数。在特定的平台上,该占比会降到 5/16 。可通过命令行选项指定 GC 线程数(稍后介绍)。
在单处理器机器上,因为并行执行(如,同步)的开销,并行GC 的表现不如 串行GC。
但对于中大型堆的应用程序来说,当运行在双处理器机器上时,并行GC 的性能通常会比 串行GC 稍好一些。有2个以上处理器时,并行GC 的表现会更好。
GC 线程数量 可通过命令行选项 -XX:ParallelGCThreads=<N> 来控制。
在已通过命令行显式设置堆大小的情况下,堆大小对良好性能的影响对 并行GC 和 串行GC 是一样的。但是启用 并行GC 应该会缩短暂停时间。
老年代碎片化
因为 多个GC线程 同时参与到 Minor GC 中,所以可能会在 “从 新生代 提升到 老年代” 的过程中产生一些碎片。每个 GC 线程都会在 Minor GC 中预留一部分老年代的空间用于“提升”操作。而这个划分 “提升缓冲区” 的操作会产生碎片。
减少 GC 线程数量 和 增大老年代容量 可以降低此“碎片化效果”。
“代” 划分
如前所述,并行GC 中“代”的划分方式不同。如下图所示