Java GC日志分析

发布时间 2023-12-13 17:39:16作者: cac2020

阅读分析虚拟机和垃圾收集器的日志是处理Java虚拟机内存问题必备的基础技能。

一、JDK统一日志格式
垃圾收集器日志是一系列人为设定的规则,多少有点随开发者编码时的心情而定,没有任何的“业界标准”可言,换句话说,每个收集器的日志格式都可能不一样。除此以外还有一个麻烦,在JDK 9以前,HotSpot并没有提供统一的日志处理框架,虚拟机各个功能模块的日志开关分布在不同的参数上,日志级别、循环日志大小、输出格式、重定向等设置在不同功能上都要单独解决。直到JDK 9,这种混乱不堪的局面才终于消失,HotSpot所有功能的日志都收归到了-Xlog参数上,这个参数的能力也相应被极大拓展了。

Xlog选项支持的参数如下:

  • -Xlog 使用info级别启用JVM日志(-Xlog等价于-Xlog:all=info:stdout:uptime,level,tags)
  • -Xlog:help:打印Xlog帮助文档
  • -Xlog:disable:关闭所有日志记录并清除日志记录框架的所有配置,包括警告和错误的默认配置
  • -Xlog[:option]:按照命令行上出现的顺序应用多个参数。同一输出的多个参数按其给定顺序覆盖。option的格式为:

 

-Xlog[:[what][:[output][:[decorators][:output-options[,...]]]]]

1、what:选择器,由标签(Tag)和日志级别(Level)共同组成。格式:tag1[+tag2...][*][=level][,...] 。除非用*指定了通配符,否则只有匹配了指定tag的日志消息才会被匹配。

(1)标签Tag:可理解为虚拟机中某个功能模块的名字,它告诉日志框架用户希望得到虚拟机哪些功能的日志输出。垃圾收集器的标签名称为“gc”,全部支持的功能模块标签名如下:(如指定为all,则表示下面所有标签的组合)

add、age、alloc、annotation、aot、arguments、attach、barrier、biasedlocking、blocks、bot、breakpoint、bytecode、census、class、classhisto、cleanup、compaction、comparator、constraints、constantpool、coops、cpu、cset、data、defaultmethods、dump、ergo、event、exceptions、exit、fingerprint、freelist、gc、hashtables、heap、humongous、ihop、iklass、init、itables、jfr、jni、jvmti、liveness、load、loader、logging、mark、marking、metadata、metaspace、method、mmu、modules、monitorinflation、monitormismatch、nmethod、normalize、objecttagging、obsolete、oopmap、os、pagesize、parser、patch、path、phases、plab、preorder、promotion、protectiondomain、purge、redefine、ref、refine、region、remset、resolve、safepoint、scavenge、scrub、setting、stackmap、stacktrace、stackwalk、start、startuptime、state、stats、stringdedup、stringtable、subclass、survivor、sweep、system、task、thread、time、timer、tlab、unload、update、verification、verify、vmoperation、vtables、workgang、

(2)日志级别:从低到高有Trace, Debug, Info, Warning, Error, Off六种级别, 日志级别决定了输出信息的详细程度,默认级别为Info,HotSpot的日志规则与Log4j、SLF4j这类Java日志框架大体上是一致的。

2、output:设置输出类型。默认为stdout。
-Xlog 支持以下类型的输出:

  • stdout :将输出发送到标准输出;
  • stderr :将输出发送到stderr;
  • file=filename:将输出发送到文本文件。你还可以让文件按照文件大小轮换,例如每记录10M就轮换,只保留5个文件等。默认情况下,最多保留5个20M的文件。可使用 filesize=10M, filecount=5 格式去指定文件大小和保留的文件数。

3、decorators:装饰器,用来装饰消息,记录与消息有关的信息。使用一系列自定义的装饰器去配置output,来要求每行日志输出都附加上额外的内容。可以为每个output配置一组自定义的装饰器,输出顺序和定义的顺序相同。缺省的装饰器为uptime、level和tags。
支持附加在日志行上的信息包括:

  • time or t :ISO-8601格式的当前日期时间;
  • utctime or utc :UTC格式的当前日期时间;
  • uptime or u :JVM启动了多久,以秒或毫秒为单位。例如6.567s;
  • timemillis or tm: 相当于 System.currentTimeMillis();
  • uptimemillis or um :JVM启动以来的毫秒数;
  • timenanos or tn :相当于 System.nanoTime();
  • uptimenanos or un: JVM启动以来的纳秒数;
  • hostname or hn :主机名;
  • pid or p :进程号;
  • tid or ti :线程号;
  • level or l :与日志消息关联的级别;
  • tags or tg :与日志消息关联的标签集;

如果不指定, 默认值是uptime、 level、 tags这三个, 此时日志输出类似于以下形式:

[3.080s][info][gc,cpu] GC(5) User=0.03s Sys=0.00s Real=0.01s

4、output-options:设置Xlog的日志输出output选项,格式:

filecount=file-count filesize=file size with optional K, M or G suffix

5、使用示例