跳到主要内容

JEP 271:统一 GC 日志记录

概括

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

非目标

确保当前 GC 日志解析器在新 GC 日志上无需更改的情况下工作并不是我们的目标。

并非所有日志条目都必须以新的日志记录格式再现。

描述

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

“gc”标签

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

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

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

这里的想法应该-Xlog:gc与您以前使用的-XX:+PrintGCDetails.但这种映射并不像从-Xlog:gc到 的映射那么严格-XX:+PrintGC。规则-XX:+PrintGC非常明确:每个 GC 一行。规则从来-XX:+PrintGCDetails都不是很明确。因此,某些-XX:+PrintGCDetials日志记录可能会映射到多个标签,而有些日志记录可能仅映射到“gc”标签的调试级别。

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

还有一些边界情况,不清楚“gc”是否是适当的标记,例如在分配代码中。大多数情况可能不应该使用“gc”标签。

其他标签

除了“gc”之外还有许多其他标签。其中一些非常清晰地映射到旧标志。PrintAdaptiveSizePolicy例如,或多或少映射到“ergo”标签(与“gc”标签和可能的其他标签组合)。

冗长

大多数由标志(开发标志)保护的日志记录Verbose应映射到跟踪级别。例外情况是,从性能角度来看,日志记录非常昂贵,在这种情况下,它会映射到开发级别。

字首

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

动态配置

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