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”标签记录日志。例如:
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
动态地打开和关闭所有日志记录。这意味着对于依赖于先前收集的数据的日志记录,仅检查日志记录是否启用是不够的;还必须进行检查以确保数据可用。