自JDK17发布以来,其免费商用、持续维护,使得许多公司开始尝试JDK17,笔者也在最近升级了JDK17且部署上了生产环境,但重要的JVM日志输出配置确没有配置清除。
⭐ 本文主要是笔者在翻阅后,提供到一套适用生产环境的JVM日志配置。 ⭐
Start
下文将从以下三个级别来推荐JVM日志输出方案:
等级 | 描述 |
---|---|
必备 | 这些配置基本上是作为项目运行的必备条件 |
增强 | 这些配置可以出现在实际运行中,可以帮助你更加详细分析 |
调试 | 这些配置只为项目的调试监控 |
笔者推荐的是
-XX:+PrintCommandLineFlags
-Xlog:gc*,safepoint,gc+heap=debug,gc+ergo*=trace,gc+age=trace,gc,phases=trace:file=gc.log:level,tags,time,uptime,pid:filesize=104857600,filecount=5
一. 必备
本节给出的是在生产环境下,⭐最基本也是必须的配置 ⭐
JDK8
JVM配置 | 描述 |
---|---|
-Xloggc:/path/to/gc.log | 写入 GC 日志的路径 |
-XX:+UseGCLogFileRotation | 启用 GC 日志文件轮换 |
-XX:NumberOfGCLogFiles=5 | 要保留的轮换 GC 日志文件数 |
-XX:GCLogFileSize=104857600 | 用于启动轮换的每个 GC 日志文件的大小 |
-XX:+PrintGCDetails | 详细的GC日志 |
-XX:+PrintGCDateStamps | 实际日期和时间戳 |
-XX:+PrintGCApplicationStoppedTime | 应用程序在 GC 期间停止的时间量 |
-XX:+PrintGCApplicationConcurrentTime | 应用程序在 GC 之间运行的时间量 |
-XX:-PrintCommandLineFlags | 打印 GC 日志中的所有命令行标志 |
JDK9+
JDK9+统一了日志输出,以标签来过滤日志输出,日志框架:Unified Logging
JVM配置 | 描述 |
---|---|
:file=/opt/gc.log | 写入 GC 日志的路径 |
:filesize=104857600,filecount=5 | 启用 GC 日志文件轮换,要保留的轮换 GC 日志文件数 |
gc* | 详细的GC日志 |
level,tags,time,uptime,pid | 实际日期和时间戳 与关键信息 |
safepoint | 应用程序在 GC 期间停止的时间量 |
-XX:-PrintCommandLineFlags | 打印 GC 日志中的所有命令行标志 |
以上配置均在一行内:
-Xlog:gc*,safepoint:file=gc.log:level,tags,time,uptime,pid:filesize=104857600,filecount=5
-XX:-PrintCommandLineFlags
二. 增强
可以被选择,帮助您在生产环境下参考更加详细的日志
JDK8
JVM配置 | 描述 |
---|---|
-XX:+PrintAdaptiveSizePolicy | 有关GC工程的详细信息 |
-XX:+PrintTenuringDistribution | 幸存者空间的使用和分配 |
-XX:+PrintReferenceGC | 处理引用所花费的时间 |
JDK9+
JVM配置 | 描述 |
---|---|
gc+ergo*=trace | 有关GC工程的详细信息 |
gc+age=trace | 幸存者空间的使用和分配 |
gc,phases=trace | 处理引用所花费的时间 |
以上配置均在一行内:
-Xlog:gc*,safepoint,gc+ergo*=trace,gc+age=trace,gc,phases,ref:file=gc.log:level,tags,time,uptime,pid:filesize=104857600,filecount=5
三. 调试
这里的配置基本只适用于调试阶段
JDK8
JVM产数 | 描述 |
---|---|
-XX:+UnlockDiagnosticVMOptions | 解锁诊断虚拟机操作系统 |
-XX:+G1SummarizeConcMark | 汇总 JVM 出口处的并发标记 |
-XX:+G1PrintHeapRegions | 打印为分配、清理、重用、压缩、cset、提交、失败等选择的堆区域… |
-XX:+G1PrintRegionLivenessInfo | 在每个并发标记周期之前和之后打印每个旧区域的上一个和下一个活动数据 |
-XX:+G1SummarizeRSetStats -XX:G1SummarizeRSetStatsPeriod=1 | 每 X 打印一次 RSet 处理信息,其中 X 以 GC 循环为单位进行测量 |
-XX:+PrintSafepointStatistics -XX:PrintSafepointStatisticsCount=1 -XX:+LogVMOutput -XX:LogFile=/path/to/gc.log | 打印有关安全点同步的原因和一些详细信息。可以控制打印前要收集的事件数。默认情况下,日志到 STDOut - LogVMOutput 可以将其推送到文件 |
-XX:+UnlockExperimentalVMOptions | 解锁实验性VMOptions |
-XX:G1LogLevel=fine, finer, finest | 增加集合的日志记录详细程度 |
-XX:+G1TraceEagerReclaimHumongousObjects | 在每次收集期间打印有关活体和死物的详细信息 巨大的物体 |
-XX:+G1ConcRegionFreeingVerbose | 调试 JVM |
JDK9+
JVM产数 | 描述 |
---|---|
-XX:+G1SummarizeConcMark | 汇总 JVM 出口处的并发标记 |
gc,region=trace | 打印为分配、清理、重用、压缩、cset、提交、失败等选择的堆区域… |
gc,liveness=trace | 在每个并发标记周期之前和之后打印每个旧区域的上一个和下一个活动数据 |
region*=all | 在每次收集期间打印有关活体和死物的详细信息 巨大的物体 |
还有写就懒得找了
读者们可以设置全量输出来检擦
-Xlog:all=trace:file=gc.log:level,tags,time,uptime,pid
End
笔者推荐,在实际生产部署中使用 增强 and 必备 两级别的配置,输出的日志不算太多。
可能有些读者看不太懂JDK9后的日志配置,推荐您看:博客