Perfetto系列-定制化内存分析插件使用说明

一、打开内部的Perfetto UI服务网址

在该内部UI服务中,不影响原生操作前提下,针对内存分析场景新增多个插件支持开发快速定位

https://perfetto.loadterminator.mioffice.cn/

二、开启定制化插件

左侧菜单栏选择plugins,然后通过关键词”MemoryAnalyzer”查找到名称为”com.软硬融合.MemoryAnalyzer”的插件,使能插件后点击”Reload required”重启UI。

三、打开trace文件

我们定制化了打开trace时OnLoad插件,支持打开带内存信息的trace文件后,会自动跳转主进程对应的内存信息泳道,并且在最底部的信息区会自动生成3个进程级内存信息统计表格。

四、内存相关定制泳道和数据表格使用说明

4.1、内存使用统计的泳道说明

4.1.1 我们对进程/子线程维度内存类型(例如Native,Java)维度分别定制了独立内存信息泳道,同时定制化了内存信息泳道的排序插件,进程级的泳道会排在前面,线程级别的泳道会随着线程级其他统计信息一起关联排布。提供的内存Count峰值的统计信息,可以直观的看到内存使用量的增加情况,特别是突然大量增加的情况。

🎄 - 进程的泳道信息包含对应的所有子线程泳道信息的总和,且只有进程泳道会附带下一级的详细count统计数据。当前采集数据中还没有支持Cycles和Instructions的信息采集,当前数据为0。

  • 泳道的命名中会有process/thread,native/java/anonymous等关键词进行差异区分,并且在末尾有pid/tid等信息。

4.1.2、泳道中分布的是测试采集结束后未被释放的内存信息,信息会按照内存申请的时间先后和耗时情况以slice切片形式在泳道中展示。切片中展示当前切片对应的调用栈中的叶子节点信息(上面是函数名,下面是lib或so)。

4.1.3、每个切片的详细信息在该切片被点击选择中后会在最下面的信息区域展示出来。

4.1.4、泳道上的切片(内存申请事件)会按照调用栈的维度进行一致性着色展示,即颜色相同的切片对应的调用栈是一样的,可以通过颜色初步判断内存申请事件的离散性。

4.1.3、每个泳道上都独立支持鼠标的悬浮高亮,当鼠标滑动到某个切片后,会将相同调用栈的所有切片高亮,其他不同的切片全部灰度掉。并且会弹出当前相同调用栈的整体内存申请大小和次数在整体统计数据中的百分比信息。

4.2、内存使用统计的数据表格说明

开启插件功能再打开包含内存统计信息的日志后,会在底部的信息区提供3个内存统计原始表格。表格中提供筛选,排序,跳转到关联切片等功能。

(1)进程上全量内存使用信息表。

🎄 注意:单击跳转为在当前缩放比例的视图的定位到特定切片,可能不太清晰看到切片信息,不会改变当前缩放比例。双击跳转为放大缩放比例后定位到特定切片,此时看到的切片信息会清晰,但是会改变当前缩放比例。

如果表格不小心关闭了,可以在命令行通过定制命令”软硬融合[SQL]: Open memory slice table”再次打开即可。

(2)按照函数名称聚合的内存使用统计表, 支持全匹配和正则匹配

如果表格不小心关闭了,可以在命令行通过定制命令”软硬融合[SQL]: Open memory func name aggregation table”再次打开即可。

(3)按照lib名称聚合的内存使用统计表。

如果表格不小心关闭了,可以在命令行通过定制命令”软硬融合[SQL]: Open memory lib name aggregation table”再次打开即可。

4.3、框选区域内存使用定制化数据说明

当我们需要对小范围事件段内的内存使用信息分析时,我们可以通过鼠标在内存使用信息的泳道上进行框选,框选后会自动在信息区域显示出相关的详细统计信息。

(1)内存申请统计信息表:

(2)内存信息调用栈火焰图

可以按照samples(运行时长)和size(占用内存大小)两种维度生成火焰图,火焰图的展示方式有Top Down和Bottom Up两种。

也支持原生的调用栈隐藏、pivot等:

Hide Stack:隐藏所有包含当前函数的所有调用栈

Hide Frame:隐藏所有调用栈中的当前函数那一层

Show From Frame:显示当前函数的所有caller调用栈

Povot:以当前函数为中心,同时展示所有的caller和callee