作者:微信小助手
发布时间:2023-04-13T09:30:32
VM 日志记录一直是 JDK 的一个重要功能,通过日志可以分析 bug 和解决性能问题。JDK 9 对 VM 日志记录的处理方式进行了几项更新,提升了用户友好性和可配置性。本文将介绍如何记录 VM 日志。
最基本的方法是在 java 命令中添加 -Xlog 来启用 VM 日志记录,使用默认配置启用 VM 日志:
-Xlog:all=info:stdout:uptime,levels,tags
上述代码将打开所有类别的 VM 日志记录,以 info 级别在 stdout 中打印 VM 日志。包括 JVM 的正常运行时间、日志语句的级别和与之相关的标签。以下是一个日志语句的示例:
[1.043s][info][methodhandles ] lookup_polymorphic_method => intrinsic {method} {0x000000010a38c880}
-xlog:gc,heap
上面的例子将限制日志输出仅包含 gc 或 heap 标记的日志语句。你也可以使用以下示例来打印同时包含 gc 和 heap 的日志,并且通过在参数结尾增加 * 可以支持打印包含 gc 或 heap 标记的任何日志:
-xlog:gc+heap
-xlog:gc*,heap*
标签可以设置为不同级别的日志记录; off, trace, debug, info, warning, error;例如,如果我想要来自堆的 debug 日志,以及来自 gc 的 error 日志,可以像下面这样设置参数:
-Xlog:'gc*=error,heap*=debug'
-Xlog:'gc*,heap*':vm-logging.log
在 java 命令中使用多个 Xlog 实例也是有效的,这对于根据类型将 VM 日志写入不同位置非常有用。在下面的示例中,gc 日志语句写入 gc.log,而堆日志语句写入 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
jcmd <pid> VM.log output="file=heap.log" output_options="filecount=5,filesize=10m" what="heap=info" decorators="time,level"
JEP 158: 统一的 JVM 日志记录:https://openjdk.org/jeps/158]
JEP 271: 统一的 GC 日志记录:https://openjdk.org/jeps/271
使用 JVM 统一日志框架启用日志记录:https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html#enable-logging-with-the-jvm-unified-logging-framework
jcmd 示例中的日志记录配置:https://gist.github.com/thomasdarimont/f89fc79491241af7a064e1b3ca2757a9
Xlog:help 的输出:https://gist.github.com/wkorando/be4a0de126371b64c48c7fac83496a53
转自:Billy Korando,
链接:https://inside.java/2022/11/07/sip071/