Skip to content

JEP 271: Unified GC Logging | 统一的 GC 日志记录

摘要

使用 JEP 158 引入的统一 JVM 日志框架重新实现 GC 日志记录。

非目标

不要求确保当前的 GC 日志解析器在新的 GC 日志上无需更改即可正常工作。

新的日志格式可能不会完全复制所有日志条目。

描述

以尽量与当前 GC 日志格式一致的方式重新实现 GC 日志记录。新旧格式之间必然会有一些差异。

“gc”标签

想法是 -Xlog:gc(仅在 “gc” 标签上以 info 级别记录日志)应该类似于 -XX:+PrintGC,即每个 GC 打印一行。这意味着应该非常小心地使用 log_info(gc)("message"),不要仅在 “gc” 标签上以 info 级别记录日志,除非它是每个 GC 都应该打印的消息。

如果与其他标签组合使用,可以在 info 级别使用“gc”标签记录日志。例如:

java
log_info(gc, heap, ergo)("Heap expanded");

这里的想法是 -Xlog:gc 应该与 -XX:+PrintGCDetails 类似。但是这种映射不像 -Xlog:gc-XX:+PrintGC 的映射那样严格。-XX:+PrintGC 的规则非常明确:每个 GC 打印一行。-XX:+PrintGCDetails 的规则从来没有非常明确过。因此,一些 -XX:+PrintGCDetails 日志可能映射到多个标签,而有些可能只映射到“gc”标签的调试级别。

所有与 GC 相关的日志记录应使用“gc”标签。大多数日志记录不应仅使用“gc”标签,而是与其他适当的标签组合使用。

还有一些边界情况,不确定是否适用“gc”标签,例如在分配代码中。其中大多数情况可能不应使用“gc”标签。

其他标签

除了 “gc” 之外,还有许多其他标签。其中一些与旧标志相当匹配。例如,PrintAdaptiveSizePolicy 基本上映射到“ergo”标签(与“gc”标签和其他标签组合)。

详细模式

大多数由 Verbose 标志(一个开发标志)保护的日志记录应映射到 trace 级别。唯一的例外是如果它是从性能角度非常昂贵的日志记录,那么它将映射到 develop 级别。

前缀

统一日志框架中的前缀支持用于向 GC 日志消息添加 GC ID。GC ID 仅对在 GC 期间发生的日志记录感兴趣。由于前缀是针对特定的标签集定义的,即一组标签的组合,因此必须确保在 GC 之间发生的日志记录不使用与在 GC 期间进行的日志记录相同的标签集。

动态配置

某些日志记录要求在先前收集的数据的基础上进行。统一日志框架允许使用 jcmd 动态地打开和关闭所有日志记录。这意味着对于依赖于先前收集的数据的日志记录,仅检查日志记录是否启用是不够的;还必须进行检查以确保数据可用。