JVM 日志记录 - Sip of Java
Billy Korando 于 2022 年 11 月 7 日发表
VM 日志记录长期以来一直是 JDK 的一部分。它可以成为执行根本原因分析和找出性能怪癖的出色工具。在 JDK 9 中,对 VM 日志记录的处理方式进行了多项更改,使其更易于使用和配置。让我们在本文中了解如何在 VM 日志记录中使用它。
启用和配置日志记录
可以通过向 java
命令添加 -Xlog
在最基本级别启用 VM 日志记录。这将启用 VM 日志记录,其默认配置为
-Xlog:all=info:stdout:uptime,levels,tags
以上内容将为 info 级别下的所有不同类别启用 VM 日志记录。它将把 VM 日志打印到 stdout,包括 JVM 的正常运行时间、日志语句的级别以及与之关联的标签。下面是日志语句的一个示例
[1.043s][info][methodhandles ] lookup_polymorphic_method => intrinsic {method} {0x000000010a38c880}
在大多数情况下,默认的 VM 日志记录会过于冗杂而无法使用。幸运的是,VM 日志记录可以配置为满足多种需求。
配置标签
启用 VM 日志记录时,开发人员通常会查看特定问题。VM 日志记录可以配置为仅生成与特定类别匹配的日志,例如:垃圾回收 (gc
)、即时编译器 (jit
)、CPU 使用率 (cpu
) 等。将日志记录限制在特定类别可以帮助减少冗余,并允许你专注于关注的领域
-xlog:gc,heap
以上示例将日志输出限制为仅包含 gc
或 heap
标签的日志语句。或者,可以使用以下示例打印出同时包含 gc
和 head
的日志,并且可以添加 *
,以便打印出包含 gc
或 heap
标签的任何日志
-xlog:gc+heap
-xlog:gc*,heap*
标签可以设置为不同的日志记录级别;off, trace, debug, info, warning, error
;例如,如果我想要 heap
的 debug
日志记录,但想要 gc
的 error
日志记录,它将如下所示
-Xlog:'gc*=error,heap*=debug'
配置输出位置
默认情况下,VM 日志记录将打印到 stdout
;但是,这通常可能不是希望发送 VM 日志记录的位置;在许多情况下,最好将 VM 日志记录写入一个单独的文件,方法如下
-Xlog:'gc*,heap*':vm-logging.log
在 java
命令中拥有 -Xlog
的多个实例也是有效的,这对于根据类型将 VM 日志写入不同位置很有用。在以下示例中,gc
日志语句被写入 gc.log
,而 heap
日志语句被写入 heap.log
。
-Xlog:'gc*':gc.log -Xlog:`heap*`:heap.log
减少性能开销
VM 日志记录可能会给 Java 应用程序造成大量的开销。为了解决这个问题,请考虑启用异步日志记录 -Xlog:async
,它会将日志语句写入内存缓冲区,该缓冲区会定期刷新。缓冲区大小可以通过 -XX:AsyncLogBufferSize=<bytes>
进行配置。就像在这个示例中
-Xlog:'gc*=trace':gc-trace.log -Xlog:async -XX:AsyncLogBufferSize=102400
在正在运行的 JVM 上配置日志记录
可以使用 jcmd
和 VM.log
在 JVM 上配置 VM 日志记录。使用 java
命令配置 VM 日志记录时可用的所有配置选项都可用,但通过 output
、output_options
、what
和 decorators
参数提供选项,就像在以下示例中
jcmd <pid> VM.log output="file=heap.log" output_options="filecount=5,filesize=10m" what="heap=info" decorators="time,level"
其他阅读材料
编码愉快!