• 一篇带你搞定⭐《生产环境JVM日志配置》⭐


    自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后的日志配置,推荐您看:博客

  • 相关阅读:
    NLP-D58-nlp比赛D27&刷题D14&读论文&mathtype
    MybatisPlus中的各种常用查询方法
    【数据结构】循环链表的增删查改
    Unity3D 常用得内置函数(Cg与GLSL)详解
    学习Bootstrap 5的第六天
    牛客网SQL基础强化
    聊聊kube-scheduler如何完成调度和调整调度权重
    运维SRE-14 自动化批量管理
    Spring-boot-starter-actuator的可视化spring-boot-admin
    C进阶-字符串和内存函数
  • 原文地址:https://blog.csdn.net/qq_35040959/article/details/127829161