诊断工具
应用可能会发生内存溢出而导致崩溃,利用诊断工具可以主动发现并分析问题。要分析内存问题,系统提供了两种诊断工具。一是您可以远程对进程打内存Dump文件,并可转存储到指定服务器。二是通过对内存进行对象统计和环比分析,判断对象数量是否存在持续增长的趋势,进而判断内存泄露的可能性。
注意:开启该功能后,对应用的CPU使用率和响应时间影响较大,并且会产生较大的尖刺。
在左侧导航栏中依次单击应用与微服务>诊断工具,进入诊断工具页面,该页面展示当前统计周期内触发的诊断记录,包括对象统计和内存Dump两类。
在页面左侧,您可以通过诊断结论、诊断类型和状态三个维度对诊断记录进行过滤。
诊断结论:包括对象数持续增长和对象数疑似增长。
对象数持续增长:当环比分析评估增量大于2000且增量比大于等于0.5时,系统认为对象数持续增长。
对象数疑似增长:当环比分析评估增量大于2000且0.1<增量比<0.5时,系统认为对象数疑似增长。
说明:评估增量和增量比的具体介绍,请参见环比分析。
诊断类型:包括对象统计和内存Dump。
状态:包括进行中、分析中、已完成和失败。
对象统计
对象统计功能是统计内存中每个类的对象数量,可以在两次对象统计间观察对象数的变化或新增加的类等。对象统计分为手动对象统计和自动对象统计两种模式,自动对象统计由平台根据应用OldGC情况,自动分配实例进行对象统计。其中FullGC或OldGC后采集的数据可以用来做环比分析。
对象统计是通过Java提供的JMX接口获取数据。如果无法通过JMX接口获取,则通过jmap命令获取。通过手动触发的对象统计可以选择是否FullGC后的采集,FullGC后采集的数据会更加准确,也可以用来做环比分析使用。自动采集的方式都是在触发OldGC后采集且有次数限制,数据可用来做环比分析。
如果您想要对指定的应用实例进行对象统计分析,请先启用对象统计功能,然后创建对象统计。
启用对象统计
在左侧导航栏中单击配置,在页面上方选择系统设置或应用设置,然后单击诊断工具页签。启用内存分析(即对象统计)功能后,应用与微服务会开始自动监测发生Old GC的实例,并对实例进行对象统计和环比分析。
5分钟内同应用发生Old GC的实例,按照GC时长倒排序,设置取前多少个实例(默认值为前2个,数据边界[1,5]),每次对象快照根据对象数排序,取前多少个类(默认值为前2000个,数据边界[前1000,前5000]);
设置会话时长(默认值30分钟,可选择时间为[30、60、120]),在会话期间内,当发生Old GC后触发一次对象快照采集,设置每多少分钟(可选择时间为[15、30])仅采集一次。
说明:会话结束后会重新筛选实例,已经开启过会话的实例优先。
勾选复选框,可启用对Parallel Old GC的对象快照采集(在该GC下的对象快照采集会产生较长的STW,请谨慎启用)。
如需进行对象的环比分析,您还需要启用自动环比分析功能,设置经过多少小时以上(默认值3小时)的因Old GC触发的对象快照采集,且每隔1/6时间都有采集点覆盖,则进行自动环比分析。若某个类的对象数持续上涨,则疑似内存泄漏。
创建对象统计
在左侧导航栏中依次单击应用与微服务>诊断工具,进入诊断工具页面。
单击诊断记录列表右上角的创建对象统计按钮,弹出对话框。
配置要诊断的应用、实例、会话时长、采集间隔信息。
会话时长:设置要统计对象的会话持续时间,默认为30分钟。创建对象统计完成后即开始计时。
采集间隔:设置采集对象快照的时间间隔,默认为10分钟采集一次对象快照。
勾选先触发Full GC然后再采集对象快照复选框后,探针在采集对象快照时,会先触发一次Full GC,然后再采集对象快照。这样采集的对象统计数据更准确,且数据可以用来做环比分析。
说明:Full GC可能会导致应用较长时间STW。
单击开始,完成配置。
创建成功后列表会显示一条状态为进行中的诊断记录。
对象统计诊断
单击诊断类型为对象统计的诊断记录,进入对象统计详情页面。左侧是当前应用实例所有的快照记录,采集时间即快照的名称,按日期和时间从近到远排序,支持通过关键字模糊搜索。选择一个快照后,右侧展示该快照的对象统计列表,可查看每个类中的对象数、对象占比、字节数和字节占比信息。默认按对象数从高到低排序,支持按对象数、对象占比、字节数和字节占比正反排序。
说明:支持对象统计的JDK版本为:Oracle JDK 6~18、OpenJDK 6~18,支持对象统计的GC为:Parallel Old 、Serial Old、CMS、G1。
列表说明
列表上方展示当前快照中的类、字节、对象统计数据。分子代表当前显示的类、字节、对象数,分母代表当前对象统计快照中所有的类、字节、对象数。字节是指类的所有对象实例占用内存空间的大小。
单击统计来源下拉菜单,可选择不同的统计来源:当前快照、同前一次快照增量对比和同前一次快照的新增类。
在搜索框中输入类名,然后单击搜索图标,可查看指定类的统计信息。支持模糊搜索,不区分大小写。
单击环比分析按钮或黄色提示条中的查看详情,进入环比分析页面,请参见环比分析。
说明:当前对象统计如果不是在Full GC 或Old GC后采集,则不能进行环比分析。
勾选不显示黑名单类后,列表不显示加入黑名单的类,黑名单请提前在应用与微服务>配置>应用设置>常规选项的页面中配置。基础类包括
java.*
、javax.*
和sun.*
,勾选不显示基础类,列表则不会显示。
环比分析
环比分析功能会进一步对实例对象进行分析计算,找到存在内存泄露风险的相关应用类并给出提示。当某个类的对象数持续上涨时,则疑似内存泄露。当发生诊断结论后,系统会以事件的形式向应用发送对象数增长事件。
环比分析页面包括A、B、C三个区域。
A区域展示经过数据分析发现的按评估增量排序Top 3的类信息。如果系统分析发现存在风险,页面上方会给出提示,如下图所示。如果需要内存Dump,可以直接点击操作(在业务空闲时操作)。
评估增量:通过对这个类的近N小时(具体时间是配置中环比分析的配置时长,默认3小时)对象数进行趋势计算,形成一条趋势线,使用趋势线的终点值减去起点值,生成评估增量。通常此值出现明显的正值,则需进一步排查是否有泄漏情况。
增量比:是用评估增量比趋势线的终点值,生成增量比。
增长趋势:通过对这个类的近N小时(具体时间是配置中环比分析的配置时长)对象数进行趋势计算,形成一条趋势线,这条趋势线的斜率为增长趋势。
统计快照数:当前环比分析中包含该类的对象的快照个数。
B区域展示当前环比分析的最后一次对象快照中对象数异常的Top 10类,根据对象数(或字节数)进行排名。
列表类名默认按照对象数排序,单击下拉菜单选择字节数可按照字节数来排序。
对象数:指某个类的对象实例的数量。
字节数:指某个类的所有对象实例占用内存空间的大小。
注意:这里的大小仅代表这个对象内各个字段大小乘以对象数量,不包含引用对象的大小。
勾选类名后(类名展示缩写,取路径的首字母),右侧图表会对应显示对象数的变化趋势图。
单击右上角的全部,可完整的查看Top 10类的对象数和字节数。
C区域跟B区域是联动的,对应展示B区域类的对象数变化趋势图。
趋势图中绿色的线为评估计算的趋势线,柱状图为每次快照里该类的对象数或字节数,面积为堆内存使用量。
趋势图右上方显示评估增量和增量比。当选择按对象数排序时,则会增加显示分析结论:对象疑似增长或对象持续增长。
当需要查看该应用内存情况时,可以单击JVM进入JVM页面,时间范围会自动调整为环比分析的时间范围。
如果当前对象快照数据过少,则无法计算趋势。
内存Dump
通过该功能您可以方便快捷地进行内存Dump,例如在容器环境下,使用内存Dump功能可以快捷的打出Dump,并将内存Dump转发至存储服务器上。
如果您想要对指定的应用实例进行内存Dump分析,请先启用内存Dump功能,然后创建内存Dump。
启用内存Dump
当系统崩溃时,您可以通过开启内存Dump功能远程对进程打内存Dump文件,并可将内存的Dump文件保存在其他服务器上,方便相关人员进行排错分析。
在左侧导航栏中单击全局配置,然后单击内存Dump页签,打开启用内存Dump功能开关即可。对于内存转储配置您可以进行以下操作:
单击右侧新建连接按钮,在输入框中填写新建转储的服务器信息,包括连接名称、连接类型、服务器地址、服务器端口(通常SFTP端口是SSH的端口)、用户名、密码以及存储路径。
说明:存储路径是指服务器上的已存在路径。
单击开启启用压缩,可压缩传输文件。
注意:内存Dump完成后压缩文件会增加一定的CPU使用率。
单击操作列的修改或删除,可对创建成功的服务器进行修改或删除。
开启转储后自动清理文件功能后,转储成功后自动删除本地的Dump文件,之后不能再做转储操作。
创建内存Dump
在左侧导航栏中依次单击应用与微服务>诊断工具,进入诊断工具页面。
单击诊断记录列表右上角的创建内存Dump按钮,弹出对话框。
配置要诊断的应用、实例、转储服务器信息。
转储至:设置内存Dump文件要保存到的服务器,默认为不转储Dump文件。转储服务器需要在全局配置下的内存Dump页签中提前配置,具体说明请参见启用内存Dump。
单击开始,完成配置。
创建成功后列表会显示一条状态为进行中的诊断记录。
内存Dump诊断
单击诊断类型为内存Dump的诊断记录,进入内Dump详情页面。
说明:支持内存Dump的JDK版本为:Oracle JDK 6~18、OpenJDK 6~18、Jrockit 1.6、IBM J9 8~18。
Dump信息展示时间、应用、实例、Pid、容器ID、实例状态、诊断状态、耗时、Dump文件、文件大小和文件状态。单击删除失败的文件状态后的叹号图标,可查看原因。
- 实例状态:实例的运行状态,只有运行中的实例才可以进行删除和转储操作。
- Dump文件:Dump文件的存储目录,未设置转储服务器可以在此路径下获取Dump文件。
- 文件状态:单击删除失败的文件状态后的叹号图标,可查看原因。
单击右下角的删除原文件按钮,可删除内存Dump原文件。单击转储按钮,可进行转储操作。
转储记录展示转储的目标服务器端口、目标路径、转储的开始时间和结束时间以及状态。
当转储状态为进行中时,支持取消转储。当转储失败时,单击叹号图标可查看失败原因。