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” 标签在 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
动态开启和关闭所有日志记录。这意味着,对于依赖先前收集的数据的日志记录,仅仅检查日志是否启用是不够的;还必须有机制来检查数据是否可用。