虚拟机及垃圾收集器日志

1、JDK9 日志

在JDK 9以前,HotSpot并没有提供统一的日志处理框架,虚拟机各个功能模块的日志开关分布在不同的参数上,日志级别、循环 日志大小、输出格式、重定向等设置在不同功能上都要单独解决。

直到JDK 9,这种混乱不堪的局面 才终于消失,HotSpot所有功能的日志都收归到了“-Xlog”参数上,这个参数的能力也相应被极大拓展 了:

-Xlog[:[selector][:[output][:[decorators][:output-options]]]]

选择器(Selector)最关键,以下两部分

    • 标签(Tag),虚拟机中某个功能模块的名字:add,age,alloc,annotation,aot,arguments,attach,barrier,biasedlocking,blocks,bot,breakpoint,bytecode
    • 日志级别(Level),共有Trace,Debug,Info,Warning,Error,Off六种级别,默认级别为Info

修饰器(Decorator),每行日志输出都附加上额外的内容,如果不指定,默认值是uptime、level、tags这三个

    • time or t:当前日期和时间。
    • uptime or u:虚拟机启动到现在经过的时间,以秒为单位。
    • timemillis  or tm:当前时间的毫秒数,相当于System.currentTimeMillis()的输出。
    • uptimemillis  or um:虚拟机启动到现在经过的毫秒数。
    • timenanos  or tn:当前时间的纳秒数,相当于System.nanoTime()的输出。
    • uptimenanos  or un:虚拟机启动到现在经过的纳秒数。
    • pid or p:进程ID。
    • tid or ti:线程ID。
    • level or l:日志级别。
    • tags or tg:日志输出的标签集。

输出选项(output-options)

    • stdout
    • stderr
    • file=filename.%p.%l.%t (后缀可将 将进程PID、时间戳等信息作为文件名的一部分)

   

举例

1、打印 gc 和class 两个模块的日志信息,打印的日志级别是Info

java -Xlog:gc,class=info pid

2、打印 gc 和 heap 两模块的 info 级别信息到日志debug文件中,并且把其中的进程信息和时间戳作为文件名一部分。日志带有附加信息:t 当前时间、um 启动历时、ti 线程 id。会对文件进行滚动切割,只保留5个文件,每个文件大小是1024个字节

java -Xlog:gc,heap=info:file=/home/debug.%p.%t.log:t,um,hn,p,ti,l,tg:filecount=5,filesize=1024 pid

 

 

2、JDK9 前后举例

1、查看GC基本信息,在JDK 9之前使用 -XX:+PrintGC,JDK 9后使用-Xlog:gc:

2、查看GC详细信息,在JDK 9之前使用 -XX:+PrintGCDetails,在JDK 9之后使用 -Xlog:gc*, 用通配符*将GC标签下所有细分过程都打印出来,如果把日志级别调整到Debug或者Trace(-Xlog:gc*),还将获得更多细节信息: