跳到主要内容

JEP 271:统一的 GC 日志记录

QWen Max 中英对照

概述

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

非目标

确保当前的 GC 日志解析器在新的 GC 日志上无需更改即可工作并不是一个目标。

并非所有日志条目都一定会以新的日志格式重现。

描述

以与当前 GC 日志格式尽可能合理一致的方式重新实现 GC 日志记录。新旧格式之间必然会存在一些差异。

“gc” 标签

这个思路是 -Xlog:gc(仅在信息级别记录“gc”标签)应该与以前的 -XX:+PrintGC 类似,后者每次 GC 都会打印一行。这意味着 log_info(gc)("message") 应该非常谨慎地使用。除非是每次 GC 应该打印的那一条消息,否则不要仅在“gc”标签上以信息级别进行记录。

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

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 标志(一个开发标志)保护的日志记录应映射到跟踪级别。例外情况是,如果从性能角度来看,日志记录的开销非常大,这种情况下会将其映射到开发级别。

前缀

统一日志框架中的前缀支持用于将 GC id 添加到 GC 日志消息中。GC id 仅对在 GC 期间发生的日志记录有意义。由于前缀是为特定的标签集定义的,即标签的组合,因此有必要确保在 GC 之间发生的日志记录不使用与 GC 期间的日志记录相同的标签集。

动态配置

一些日志记录要求在较早的状态下已经收集了数据。统一的日志记录框架允许使用 jcmd 动态开启和关闭所有日志记录。这意味着,对于依赖先前收集的数据的日志记录,仅仅检查日志是否启用是不够的;还必须有机制来检查数据是否可用。