native堆-通过工具分析内存占用

展示报告内容介绍:

plots业务可以不用关注,它的用处主要用于支撑下面html解析生成

csv下面有个 showmap原始数据文件夹

  1. native_all_iters_peak_rss_comparison.html文件内容解读

总览:

三轮showmap数据曲线图:

不用关注fake1和fake2,测试工具需要对比4个机型的数据,因为当前只比较两个,所以mock两个假数据。

单轮数据:

单轮showmap曲线

从三轮数据中选取最接近均值的一轮,作为分析对象

showmap数据的抓取从测试开始到测试结束全程抓取,可以理解成不断的抓showmap数据

左侧表:测试机和对比机都是第一轮数据接近均值,所以选出作为分析。

右侧表:过滤具体场景,比如当前是native匿名页,这里边可以看到测试开始时当前进程已经有20MB的内存了。

最下面的showmap_86 作为结束时的showmap数据,showmap 拆分就是基于该文件

分场景比较内存:

可以对比看 native堆/java堆内存差异,文件页差异等,下面的三个表可以具体展开看更细力度的数据

java堆/native堆 文件页过滤规则

native堆问题分析方法

通过自研工具(mem use)抓获的内存数据可以明确的指出方法分配内存的大小,通过跟对比机比较相同函数内存差值,可以快速的定位问题。

可以先从库维度看下,差异在哪里

函数维度,找到具体申请内存的函数

通过perfetto查看具体的调用栈

内存工具提供的perfetto,必须通过该网址打开 https://perfetto.loadterminator.mioffice.cn/

该工具有使用问题可以联系 @钟万勇

内存工具-内存占用分析

Systemui 开机native内存占用分析

Perfetto 功能补充 @钟万勇

火焰图查看

提供了两种方式抓取的火焰图①②都可用于分析,数据获取方式不同。

①是内存采集工具(mem use) hook抓取的内存信息数据转成的火焰图(数据精准,实际内存使用的大小,可能存在调用栈层级少的情况)

②是simpleperf抓取时加了内存参数,解析出来的结果(调用栈回栈信息更全,只包含malloc,不包含free的内存

chrt -f 10 simpleperf record -g -p {pids_str} —duration 30 -e kmem:mm_page_alloc -c 1 -m {simple_buf} —cpu-percent 99 —user-buffer-size 1536M -o {outfile}

内存火焰图查看调用栈:

火焰图diff对比

fire_html中的两个json文件,是基于火焰图的base数据做了格式化,前端工具解析该json文件

对比火焰图通过该网址打开:https://test.loadterminator.mioffice.cn/#/flamegraph/demo

分析案例

内存工具-内存占用分析

Systemui 开机native内存占用分析