文档

接入GC日志

更新时间:

您可以将GC(Garbage Collection)日志接入到全栈可观测应用中,进行可视化展示。

前提条件

  • 已创建全栈可观测实例。具体操作,请参见创建实例

  • 已在Java进程中设置GC日志采集参数,且将GC日志采集到文件中。参数说明如下:

    • JDK8参数说明

    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:gc-%p.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M 

    参数

    是否必选

    参数说明

    -XX:+PrintGCDetails

    用于打印详细的垃圾收集日志。

    -XX:+PrintGCDateStamps

    用于在垃圾收集日志中打印日期时间戳。

    启用该参数后,JVM会在每条垃圾收集日志中打印日期和时间信息。该信息可用于分析垃圾收集日志的时序性,帮助开发人员更好地理解垃圾收集的行为和效果。

    该参数通常与其他垃圾收集日志相关的参数一起使用,例如-XX:+PrintGCDetails-XX:+PrintGCTimeStamps,以提供更全面的垃圾收集日志 。

    -XX:+PrintGCTimeStamps

    用于在垃圾收集日志中打印时间戳。

    启用该参数后,JVM会在每条垃圾收集日志中打印时间戳信息,包括垃圾收集的开始时间和结束时间。该信息可用于分析垃圾收集的时序性和性能,帮助开发人员更好地理解应用程序的垃圾收集行为,并进行性能优化。

    该参数通常与其他垃圾收集日志相关的参数一起使用,例如-XX:+PrintGCDetails-XX:+PrintGCDateStamps,以提供更全面的垃圾收集日志。

    -Xloggc

    用于将垃圾收集日志输出到指定文件中。格式为-Xloggc:gc-%p.log,其中gc-%p.log为文件路径。

    在JDK8中,-Xloggc参数仍然有效,用法仍为-Xloggc:gc-%p.log。该参数通常与其他垃圾收集日志相关的参数一起使用,例如-XX:+PrintGCDetails-XX:+PrintGCTimeStamps,以提供更全面的垃圾收集日志信息。

    -XX:+UseGCLogFileRotation

    否(建议添加)

    用于启用垃圾收集日志文件的轮转功能。

    启用该参数后,JVM会自动对垃圾收集日志文件进行轮转,即达到一定大小或时间间隔后,会自动创建一个新的日志文件,同时保留旧的日志文件。这样可以避免垃圾收集日志文件过大,占用过多磁盘空间,也便于开发人员进行日志文件的管理和分析。

    该参数通常与其他垃圾收集日志相关的参数一起使用,例如-XX:GCLogFileSize-XX:GCLogFileSize等,以控制日志文件的轮转条件和策略。

    -XX:NumberOfGCLogFiles

    否(建议添加)

    用于设置垃圾收集日志文件轮转时保留的文件数量。

    设置该参数后,JVM会根据该参数值保留指定数量的垃圾收集日志文件,超过数量后会删除最旧的日志文件。通过该参数可避免过多的日志文件占用磁盘空间。

    该参数通常与-XX:+UseGCLogFileRotation参数一起使用,以控制垃圾收集日志文件的轮转行为。

    -XX:GCLogFileSize

    否(建议添加)

    用于设置垃圾收集日志文件大小。

    设置该参数后,JVM会根据该参数值控制每个垃圾收集日志文件的大小,一旦达到设置的文件大小,JVM会自动创建一个新的文件,同时保留旧文件。通过该参数可避免过多的日志文件占用磁盘空间。

    该参数通常与-XX:+UseGCLogFileRotation参数一起使用,以控制垃圾收集日志文件的轮转行为。

    • JDK11参数说明:

      在JDK11中,上边的其余参数全部不可用,只保留-Xloggc。JDK11引入了新的垃圾收集日志系统,称为统一日志系统(Unified Logging)。即在JDK11中,您可以使用-Xlog:gc*:file来替代-Xloggc:。该方式提供了更多的灵活性和功能,可以更精确地控制日志的输出格式和级别。

      -Xlog:gc*:file=gc-%p-%t.log:time,pid:filecount=5,filesize=10M
      说明

      %t是时间,%p是pid,filecount是轮转数量,filesize是文件大小。

背景信息

当开发人员遇到Java应用程序性能问题时,JVM GC日志分析是解决问题的重要步骤之一。GC日志提供了关于垃圾回收的详细信息,包括GC触发的原因、GC类型、GC持续时间以及被回收的对象数量等。通过对GC日志进行分析,可以帮助开发人员定位和解决以下常见问题。

  1. 内存泄露:通过分析GC日志,可以获得对象的创建和销毁过程,以及对象在堆内存中的分配情况。如果某些对象在使用完之后没有被正确释放,就可能导致内存泄露。通过分析GC日志,可以判断是否存在内存泄露问题,找出造成内存泄露的原因,并及时修复。

  2. 内存占用过高:GC日志可以显示应用程序的内存使用情况,包括堆内存的使用情况、对象的分布情况等。通过分析GC日志,可以了解到哪些对象占用了大量的内存空间,进而进行内存优化,减少内存的占用。

  3. GC性能问题:GC日志可以提供GC的触发原因、频率和持续时间等信息。通过分析GC日志,可以了解GC的性能情况,包括GC频率是否过高、GC时间是否过长等。如果GC频繁或者GC时间过长,都可能影响应用程序性能。通过分析GC日志,可以找到导致GC性能问题的原因,并进行相应地优化。

  4. 垃圾回收策略选择:JVM提供了多种垃圾回收算法,如标记-清除算法、复制算法、标记-整理算法等。通过分析GC日志,可以了解不同垃圾回收算法的性能表现,选择合适的垃圾回收策略,以提高应用程序的性能和稳定性。

数据流说明

GC日志数据流说明如下图所示。

image.png

操作步骤

  1. 登录日志服务控制台

  2. 日志应用区域的智能运维页签下,单击全栈可观测

  3. SLS全栈可观测页面,单击目标实例。

  4. 在左侧导航栏中,单击全栈监控

    首次在该实例中使用性能监控时,还需单击立即开启

  5. 在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到JVM监控区域的GC日志分析

    首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击创建图标,可进入配置页面。

  6. 创建及选择机器组。

    • 如果您已有可用的机器组,请单击使用现有机器组

    • 如果您还没有可用的机器组,请执行以下操作(以ECS为例)。

      1. ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建

        具体操作,请参见安装Logtail(ECS实例)

        重要

        如果您的服务器是与日志服务属于不同账号的ECS、其他云厂商的服务器和自建IDC时,您需要手动安装Linux Logtail 0.16.40及以上版本。具体操作,请参见安装Logtail(Linux系统)。手动安装Logtail后,您必须在该服务器上手动配置用户标识。具体操作,请参见配置用户标识

      2. 安装完成后,单击确认安装完毕

      3. 创建机器组页面,输入名称,单击下一步

        日志服务支持创建IP地址机器组和用户自定义标识机器组,详细参数说明请参见创建IP地址机器组创建用户自定义标识机器组

  7. 数据源设置中,完成如下配置,然后单击完成

    重要参数说明如下,其他保持默认配置。

    参数

    说明

    示例

    配置名称

    Logtail采集配置的名称。

    host-szytbsxv

    日志路径

    GC日志文件所在路径。

    /app/sls-mall/*.gc*

    是否为Docker文件

    如果Java进程运行在Docker容器或Kubernetes中,则需选中是否为Docker文件

    是否部署于K8s

    如果Java进程部署在Kubernetes中,则需选中是否部署于K8s

    模式

    日志文件采集模式,选择极简模式

    极简模式

    Topic生成方式

    当您在同一个主机或容器中部署了多Java进程时,可使用Topic区分各个Java进程的GC日志。

    推荐使用文件路径正则方式生成Topic。使用该方式时,您需要先在JVM GC文件名中添加 %p 参数以记录Java进程ID,例如-Xloggc:gc-%p.log。设置后,系统将在GC文件名中添加pid后缀,例如gc-pid1.log.0.current

    文件路径正则

    自定义正则

    生成Topic的正则表达式。更多信息,请参见日志主题

    由于全栈可观测应用默认通过pid字段进行关联分析,所以建议设置正则表达中的命名捕获组为(?P<pid>)

    /sls-mall/gc-pid(?P<pid>\d*).log.*

    设置完成后,日志服务将自动生成Metricstore等资产。更多信息,请参见资产说明

GC指标列表

重要

下述的GC指标是通过日志服务ScheduleSQL生成的。

GC指标主要分为时间和空间两个大维度。

  • 时间维度:在每次GC过程中,每一阶段所花费的时间以及总体时间。

  • 空间维度:每次GC前后的各个区域的空间大小以及各个区域空间晋升的变化情况。

时间

GC线程在CPU上占用的时间(GC_CPU_USED)

Label

说明

instance_id

示例ID。

gc_type

GC类型,例如G1、CMS、ZGC 等。

type

GC耗时的类型。

  • USER:处于用户态的时间。

  • SYS:处于内核态的时间,包括IO阻塞的时间。

  • REAL:真实执行时间。

GC暂停时间(GC_PAUSE_TIME)

在GC持续时间中,有一部分处于并发状态,此阶段不会影响用户应用,减去并发时间得到的暂停时间,才是影响用户应用的时间,因此暂停时间更有参考意义。

Label

说明

instance_id

示例ID。

gc_type

GC算法。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

type

GC类型。

  • Young GC

  • Mixed GC

  • Full GC

  • Concurrent Mark Cycle

  • Concurrent Undo Cycle

  • CMS

  • Garbage Collection

GC各个子阶段花费时间(GC_SUBPHASE_TIME)

Label

说明

instance_id

示例ID。

gc_type

GC算法。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

type

GC类型。

  • Young GC

  • Mixed GC

  • Full GC

  • Concurrent Mark Cycle

  • Concurrent Undo Cycle

  • CMS

  • Garbage Collection

subphase

GC子阶段名称。

  • CMS GC重要阶段

    • Concurrent Mark

    • Final Remark

  • CMS GC所有阶段

    • Initial Mark

    • Concurrent Preclean

    • Concurrent Abortable preclean

    • Concurrent Mark

    • Final Remark

    • Concurrent Sweep

    • Concurrent Reset

    • Concurrent Mode Interrupted

    • Concurrent Mode Failure

    • Rescan

    • Class unloading

    • Scrub Symbol Table

    • Scrub String Table

  • G1重要阶段

    • Concurrent Mark

    • Concurrent Mark From Roots

    • Pause Remark

    • Object Copy

  • G1 GC所有阶段

    • Concurrent Clear Claimed Marks

    • Root Region Scanning

    • Concurrent Mark From Roots

    • Concurrent Preclean

    • Concurrent Mark

    • Concurrent Mark Reset For Overflow

    • Pause Remark

    • Concurrent Rebuild Remembered Sets

    • Pause Cleanup

    • Concurrent Cleanup

    • Finalize Marking

    • Class Unloading

    • Reference Processing

    • Concurrent Mark Abort

    • Mark Live Objects

    • Prepare for Compaction

    • Adjust Pointers

    • Compact Heap

    • Ext Root Scanning

    • Update Remember Set

    • Scan Remember Set

    • Code Root Scanning

    • Object Copy

    • Termination

    • Code Root Fixup

    • Code Root Purge

    • Clear Card Table

    • Choose Collection Set

    • Evacuation Failure

    • Ref Enq

    • Redirty Cards

    • Humongous Register

    • Humongous Reclaim

    • Free Collection Set

GC耗时(GC_COST_TIME)

Label

说明

instance_id

示例ID。

gc_type

GC类型。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

空间

GC回收前内存情况(BEFORE_GC_REGION_SIZE)

Label

说明

instance_id

示例ID。

gc_type

GC类型。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

type

各区域名称。

  • Young

  • Old

  • Humongous

  • Heap

  • Metaspace

GC 回收后内存情况(AFTER_GC_REGION_SIZE)

Label

说明

instance_id

示例ID。

gc_type

GC类型。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

type

各区域名称。

  • Young

  • Old

  • Humongous

  • Heap

  • Metaspace

晋升空间大小(GC_PROMOTION)

Label

说明

instance_id

示例ID

gc_type

GC类型。

  • Serial GC

  • Parallel GC

  • ZGC

  • Generational ZGC

  • Shenandoah GC

  • Generational Shenandoah GC

  • G1 GC

  • CMS GC

后续步骤

接入JVM监控数据后,全栈可观测应用会自动生成专属仪表盘。您可以通过仪表盘分析监控数据。具体操作,请参见查看仪表盘