native堆-通过工具分析内存占用
展示报告内容介绍:
plots业务可以不用关注,它的用处主要用于支撑下面html解析生成
csv下面有个 showmap原始数据文件夹
- 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/
该工具有使用问题可以联系 @钟万勇
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