带有 G1GC 的 SerialOld GC

SerialOld GC with G1GC

我正在使用 G1GC,在 java 任务控制中我发现了以下内容:

为什么显示SerialOld?在配置中,它显示以下内容:

我相信这是 G1 中的 Full GC 操作。 JDK10之前是串行的,集成JEP 307后是并行的。从这些阶段的持续时间也可以看出这一点:与常规 G1 周期相比,将近 4 秒。

查看来源:G1 Full GC used the SerialOldTracer for reporting, now it uses G1FullTracer。因此,在 JDK 10 之前它会报告 "SerialOld" 进行 Full GC,它现在应该报告 "G1Full".

如前所述,这与 Full GC 有关,但对于不熟悉该概念的任何人,我将尝试澄清:

Full GC 只有在 G1GC 以某种方式无法跟上,或者 something/someone 明确请求时才会发生。您现在可以紧急回退到经典的 stop-the-world 垃圾收集,而不是短时间(亚秒级)的大部分并发垃圾收集,这可能需要很多秒(取决于堆使用情况)。

请参阅调优建议,例如:

Oracle Java SE version 9 GC Tuning advice

要确定导致 Full GC 的原因,您(或处于相同情况的任何其他人)可能需要启用 GC 日志记录。 (例如:-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:<file-path> 在 Java 9 之前和从 Java 9 开始:-Xlog:gc*:file=<file-path> )。如果您确定 GC 日志记录已写入快速存储,请参阅:https://engineering.linkedin.com/blog/2016/02/eliminating-large-jvm-gc-pauses-caused-by-background-io-traffic