JVM 日志记录长期以来一直是 JDK 的一部分。它可以成为执行根本原因分析和找出性能怪癖的绝佳工具。在 JDK 9 中,对 JVM 日志记录的处理方式进行了一些更改,使其更加用户友好和可配置。让我们看看如何使用本文中的 VM 日志记录。
启用和配置日志记录
-Xlog
通过添加到您的java
命令,可以在最基本的级别启用 VM 日志记录。这将启用具有默认配置的 VM 日志记录:
-Xlog:all=info:stdout:uptime,levels,tags
以上将在信息级别为所有不同类别打开 JVM 日志记录。它会将 JVM 日志打印到标准输出,包括 JVM 的正常运行时间、日志语句的级别以及与之关联的标签。以下是日志语句的示例:
[1.043s][info][methodhandles ] lookup_polymorphic_method => intrinsic {method} {0x000000010a38c880}
在大多数情况下,默认的 JVM 日志记录会过于嘈杂而无用。幸运的是,可以配置 JVM 日志记录以满足许多需求。
配置标签
启用 JVM 日志记录时,开发人员通常会研究特定问题。JVM 日志记录可以配置为仅生成与特定类别匹配的日志,例如:垃圾收集 ( gc
)、即时编译器 ( jit
)、CPU 使用率 ( cpu
) 等等。将日志记录限制在特定类别有助于减少噪音并让您专注于关注的领域:
-xlog:gc,heap
上面的示例将日志输出限制为仅包含gc
或heap
标记的日志语句。或者,以下示例可用于打印包含gc
AND的日志head
,并且*
可以添加,以便打印包含gc
或heap
标签的任何日志:
-xlog:gc+heap
-xlog:gc*,heap*
标签可以设置不同级别的日志记录;; 例如,如果我想为but for记录日志,它看起来像这样:off, trace, debug, info, warning, error``debug``heap``error``gc
-Xlog:'gc*=error,heap*=debug'
配置输出位置
默认情况下,JVM 日志将打印到stdout
; 然而,这可能不是 JVM 日志发送到的理想位置;在许多情况下,最好将 JVM 日志记录写入单独的文件,可以这样做:
-Xlog:'gc*,heap*':vm-logging.log
-Xlog
在一个命令中有多个实例也是有效的java
,这对于根据类型将 JVM 日志写入不同的位置很有用。在下面的示例中,gc
日志语句被写入,gc.log
而heap
日志语句被写入heap.log
.
-Xlog:'gc*':gc.log -Xlog:`heap*`:heap.log
降低性能开销
JVM 日志记录可能会给 Java 应用程序带来不小的开销。为了帮助解决这个问题,请考虑启用异步日志记录-Xlog:async
,它将日志语句写入内存缓冲区,该缓冲区将被定期刷新。缓冲区大小可以配置为-XX:AsyncLogBufferSize=<bytes>
。就像在这个例子中一样:
-Xlog:'gc*=trace':gc-trace.log -Xlog:async -XX:AsyncLogBufferSize=102400
在正在运行的 JVM 上配置日志记录
JVM 日志记录可以在 JVM 上使用jcmd
和进行配置VM.log
。使用命令配置 JVM 日志记录时可用的所有配置选项java
都可用,但提供选项是通过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"
附加阅读
<<<<<<<<<<<< [完] >>>>>>>>>>>>