查看原文
其他

小酌 Java:JVM 日志参数

点击关注 👉 Java技术迷 2023-05-06

点击关注公众号,Java干货及时送达

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}

在大多数情况下,默认的 VM 日志记录可能过于繁杂可用性不高。幸运的是,VM 日志记录可以进行配置以适应各种需求。

配置标签


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


-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'


配置日志输出位置


默认情况下,VM 日志将打印到 stdout。但是,这通常不是 VM 日志推荐的位置。在大多数情况下,最好将 VM 日志写入单独的文件。可以按照下面这样设置参数:

-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


为运行中的 JVM 上配置日志记录


可以使用 jcmd 和 VM.log 在 JVM 上配置 VM 日志记录。所有 java 命令配置 VM 日志记录时提供的所有配置选项都可使用,但是需要通过 output、output_options、what 和 decorators 参数指定,下面是一个 jcmd 的使用示例:


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/

  

1、GPT-4救了我狗的命!

2、Linux 的 TCP 连接数量最大不能超过 65535?那服务器是如何应对百万千万的并发的?

3、Spring全家桶笔记,这是真的强!

4、一次 Nacos 导致的 CPU 飙高问题完整复盘

5、只会 RedisTemplate 访问 Redis ?这几种方式给你安排上!

6、一次应用多次fgc原因的排查及解决

点在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存