Jvm日志记录 :java的sip

22-11-16 banq

VM 日志记录长期以来一直是 JDK 的一部分。它可以成为执行根本原因分析和找出性能怪癖的绝佳工具。在 JDK 9 中,对 VM 日志记录的处理方式进行了一些更改,使其更加用户友好和可配置。让我们看看本文中如何使用 VM 日志记录。

启用和配置日志记录
添加-Xlog到您的java命令,可以在最基本的级别启用 VM 日志记录。这将使用以下默认配置启用 VM 日志记录:

-Xlog:all=info:stdout:uptime,levels,tags


以上将在信息级别为所有不同类别打开 VM 日志记录。它会将 VM 日志打印到 stdout,包括 JVM 的正常运行时间、日志语句的级别以及与之关联的标签。
下面是这样一个日志语句的输出例子:

[1.043s][info][methodhandles           ] lookup_polymorphic_method => intrinsic {method} {0x000000010a38c880}


配置标签
开发人员在启用 VM 日志记录时通常会调查特定问题。VM 日志记录可以配置为仅生成与特定类别匹配的日志,例如;垃圾回收 ( gc)、即时编译器 ( jit)、CPU 使用率 ( cpu) 等。将日志记录限制为特定类别有助于减少噪音并让您专注于关注的领域:

-xlog:gc,heap


标签可以被设置为不同级别的日志;off, trace, debug, info, warning, error;例如,如果我想对堆进行调试日志,但对GC进行错误日志,它将看起来像这样

-Xlog:'gc*=error,heap*=debug'


配置输出位置
默认情况下,虚拟机日志将打印到stdout;但是,这可能并不是虚拟机日志需要发送的位置;在许多情况下,最好将虚拟机日志写入一个单独的文件,可以这样做:

-Xlog:'gc*,heap*':vm-logging.log



减少性能开销
虚拟机日志可能会给Java应用程序带来非同小可的开销。为了帮助解决这个问题,可以考虑启用异步日志 -Xlog:async,这将把日志语句写到内存缓冲区,并定期刷新。缓冲区的大小可以用-XX:AsyncLogBufferSize=<bytes>来配置。就像在这个例子中。

-Xlog:'gc*=trace':gc-trace.log -Xlog:async -XX:AsyncLogBufferSize=102400


在正在运行中的JVM上配置日志
可以用jcmd和VM.log在JVM上配置VM日志。在用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"


参考:

]JEP 158: Unified JVM Logging

JEP 271: Unified GC Logging

Enable Logging with the JVM Unified Logging Framework

Configuring Logging with jcmd Example

Print out of -Xlog:help

​​​​​​​