Skip to main content

FOOM 个例详情

FOOM 个例详情提供 Bugly 收集到的 FOOM 个例的详细信息,以提供给业务开发人员定位内存使用的信息。

个例聚类

Bugly 尽量将上报的个例进行聚类,生成 issue,方便业务开发以 issue 维度跟进定位问题。

目前情况下,Bugly 通过 FOOM 个例中的分配堆栈提取信息聚类。因为 FOOM 采集堆栈的策略问题,并非所有的上报个例都拥有分配堆栈信息,因此对于无堆栈的问题,会进入一个特殊的 issue 类别 -- "无堆栈问题"。其他包含堆栈的个例,则提取堆栈中的特征,形成聚类特征进行聚类。

注意

事实上,由于开启堆栈的占比较少,因此绝大部分的个例问题,都会被聚类在"无堆栈问题"中。

个例详情

从“FOOM -- 问题列表”进入到一个 issue 中,会展示该 issue 下的所有个例问题。个例问题除基本的信息外,最重要的部分便是“堆栈分配详情”数据。

堆栈分配详情

堆栈分配详情中的数据便是 Bugly SDK 收集的 App 在运行过程中记录到的 malloc logger 信息。

在 malloc logger 记录中,按照相同的分配类型和分配堆栈进行了合并,展示对应的堆栈分配的数量和总大小。

⚠️注

如前面提到的原因,此处堆栈并不会包含所有的内存分配,只会包含在现有策略下记录到分配而未释放的内存操作行为。

  • 未在记录策略中的分配不会包含:默认记录策略下,只有同时满足以下条件的分配才会记录;
    • 单次分配大于阈值,默认阈值为 8K,可通过配置调整;
    • 相同堆栈累计分配大于阈值,默认阈值为 512K,可通过配置调整;
  • 堆栈分配记录开启前的分配不会包含:在记录逻辑开始前已分配的内存不会在记录中。

如上述原因,堆栈分配详情不会包含所有的分配信息,但是满足以上条件的分配会在其中,对部分大量使用内存的问题可以提供有效的信息。

堆栈分配树、火焰图

堆栈分配树和火焰图是对“堆栈分配详情”中的堆栈数据进聚合产生的数据,其没有特殊含义,只是通过聚合为树结构后,可以更直观的发现内存分配的占比等情况。

VMMAP

VMMAP 指的是虚拟内存管理器 (VMM) 的内存分配表,它记录了所有内存区域的分配信息,包括堆栈内存。

vmmap example

在上述记录策略外的内存问题,堆栈分配详情可能无法直接提供有效信息,因此后续引入了 VMMAP 数据。VMMAP 数据类似 vmmap 命令的输出,提供的是内核管理的内存信息的使用情况,包括 user_tag, vitrual_size, dirty_size, compressed size 等信息(点击后面的’!‘可了解对应的解释)。此处的 user_tag 与内存堆栈分配详情中的“分配类型”对应。

Bugly SDK 会周期性采集该数据,其采集频率与内存指标相关,因此其拿到的值为峰值内存时的 VMMAP 信息。且基本包含所有的内存使用情况。

因采集频率的缘故,可能无法与最终的峰值内存一致。

通过 VMMAP 信息,可以大致了解到主要的内存使用情况,再结合其他因素进行进一步的分析。

动态配置调整&内存图辅助

对于内存分配堆栈无法定位的问题,建议开发者尝试以下几种方法:

  1. 通过 VMMAP 信息调整“单次分配阈值”与“相同堆栈累计分配阈值”,等待收集更全面的数据;

    通过 Bugly 配置修改上述阈值,可以迫使其记录到所需要的区间的内存分配数据。

  2. 查询关联的“内存图”上报,使用内存图进行问题进一步分析;

    查询是否有内存图上报,可以使用内存图分析进一步分析问题。