您可以将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日志进行分析,可以帮助开发人员定位和解决以下常见问题。
内存泄露:通过分析GC日志,可以获得对象的创建和销毁过程,以及对象在堆内存中的分配情况。如果某些对象在使用完之后没有被正确释放,就可能导致内存泄露。通过分析GC日志,可以判断是否存在内存泄露问题,找出造成内存泄露的原因,并及时修复。
内存占用过高:GC日志可以显示应用程序的内存使用情况,包括堆内存的使用情况、对象的分布情况等。通过分析GC日志,可以了解到哪些对象占用了大量的内存空间,进而进行内存优化,减少内存的占用。
GC性能问题:GC日志可以提供GC的触发原因、频率和持续时间等信息。通过分析GC日志,可以了解GC的性能情况,包括GC频率是否过高、GC时间是否过长等。如果GC频繁或者GC时间过长,都可能影响应用程序性能。通过分析GC日志,可以找到导致GC性能问题的原因,并进行相应地优化。
垃圾回收策略选择:JVM提供了多种垃圾回收算法,如标记-清除算法、复制算法、标记-整理算法等。通过分析GC日志,可以了解不同垃圾回收算法的性能表现,选择合适的垃圾回收策略,以提高应用程序的性能和稳定性。
数据流说明
GC日志数据流说明如下图所示。
操作步骤
登录日志服务控制台。
在日志应用区域的智能运维页签下,单击全栈可观测。
在SLS全栈可观测页面,单击目标实例。
在左侧导航栏中,单击全栈监控。
首次在该实例中使用性能监控时,还需单击立即开启。
在左侧导航栏中,单击数据接入,然后在数据接入配置页面,找到JVM监控区域的GC日志分析。
首次创建目标监控项的接入配置时,打开创建开关,可进入配置页面。如果您已创建过接入配置,则单击图标,可进入配置页面。
创建及选择机器组。
如果您已有可用的机器组,请单击使用现有机器组。
如果您还没有可用的机器组,请执行以下操作(以ECS为例)。
在ECS机器页签中,通过手动选择实例方式选择目标ECS实例,单击创建。
具体操作,请参见安装Logtail(ECS实例)。
重要如果您的服务器是与日志服务属于不同账号的ECS、其他云厂商的服务器和自建IDC时,您需要手动安装Linux Logtail 0.16.40及以上版本。具体操作,请参见安装Logtail(Linux系统)。手动安装Logtail后,您必须在该服务器上手动配置用户标识。具体操作,请参见配置用户标识。
安装完成后,单击确认安装完毕。
在创建机器组页面,输入名称,单击下一步。
日志服务支持创建IP地址机器组和用户自定义标识机器组,详细参数说明请参见创建IP地址机器组和创建用户自定义标识机器组。
在数据源设置中,完成如下配置,然后单击完成。
重要参数说明如下,其他保持默认配置。
参数
说明
示例
配置名称
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耗时的类型。
|
GC暂停时间(GC_PAUSE_TIME)
在GC持续时间中,有一部分处于并发状态,此阶段不会影响用户应用,减去并发时间得到的暂停时间,才是影响用户应用的时间,因此暂停时间更有参考意义。
Label | 说明 |
instance_id | 示例ID。 |
gc_type | GC算法。
|
type | GC类型。
|
GC各个子阶段花费时间(GC_SUBPHASE_TIME)
Label | 说明 |
instance_id | 示例ID。 |
gc_type | GC算法。
|
type | GC类型。
|
subphase | GC子阶段名称。
|
GC耗时(GC_COST_TIME)
Label | 说明 |
instance_id | 示例ID。 |
gc_type | GC类型。
|
空间
GC回收前内存情况(BEFORE_GC_REGION_SIZE)
Label | 说明 |
instance_id | 示例ID。 |
gc_type | GC类型。
|
type | 各区域名称。
|
GC 回收后内存情况(AFTER_GC_REGION_SIZE)
Label | 说明 |
instance_id | 示例ID。 |
gc_type | GC类型。
|
type | 各区域名称。
|
晋升空间大小(GC_PROMOTION)
Label | 说明 |
instance_id | 示例ID |
gc_type | GC类型。
|
后续步骤
接入JVM监控数据后,全栈可观测应用会自动生成专属仪表盘。您可以通过仪表盘分析监控数据。具体操作,请参见查看仪表盘。