Native Memory 是查看内存的分配和释放等情况。
配置参数说明:
点击Advance Options进入高级配置界面
再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_nativememory.htrace,拖动滚动条设置 buffer size 大小是 64MB,抓取时长是 50s。
点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。
命令行参数说明:
输入 hdc shell,进入设备,执行命令。
执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。
将抓取的 Native Memory 文件导入到 smartperf 工具中查看,查看内存的分配和释放等情况。
点击齿轮状的图标可以设置内存的展示单位。
Current Bytes:以申请内存的size绘制泳道图。
Native Memory Density:以申请内存的数量绘制泳道图。
All Heap&Anonymous VM:malloc分配和mmap分配的总量。
All Heap:malloc分配的内存。
All Anonymous VM:mmap分配的内存。
可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有五个 tab 页。
Statistics 的 Tab 页,主要显示了统计明细类型。
Memory Type:内存的类型。
Existing:框选区间内申请没有释放的大小。
#Existing:框选区间内申请没有释放的次数。
Transient:框选区间内释放的大小。
#Transient:框选区间内释放的次数。
Total Bytes:框选区间内申请的大小。
#Total: 框选区间内申请的次数。
Peak Value: 框选区间内内存申请的峰值。
Existing/Total:框选区间内剩余的内存比上申请的内存,其中浅紫色是框选区间内申请的大小/整个时间轴(申请+释放的总大小),深紫色是框选区间内(申请+释放)的大小/整个时间轴(申请+释放的总大小)。
Analysis 的 Tab 页,主要从Memory Type、Thread、Library、Function等维度展示内存统计信息。
Call Info 的 Tab 页,主要显示了调用树详细类型。
Symble Name:每个内存分配的调用栈。
Size:分配的总大小。
Count:相同调用栈出现的次数。
Native Memory 的 Tab 页,主要显示了单次分配信息列表。
Address:内存块的地址。
Memory Type:内存分配的类型。
Timestamp:时间戳信息。
State:内存地址当前状态Existed 表示框选区间内未释放,Freed表示已释放。
Size:该次申请分配内存的大小。
Responsible Library :调用该函数的库。
Responsible Caller :调用该函数的方法。
Snapshot List 的 Tab 页,主要显示了各时刻内存的增长的差值。
Snapshot:标记的打点说明。
Timestamp :时间戳信息。
Net Growth :自从上次Snapshot的增长量,是计算分配和释放的。
Total Growth :自从上次Snapshot的增长量,是计算每一次分配的。
#Existing :仍然存在的内存数。
在 Call Info 和 Native Memory 的 Tab 页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。
点击下方的 All Allocations 可以对 Allocation 的 lifespan 进行过滤,有三个选择:All Allocations,Created & Existing,Created & Destroyed。
All Allocations:所有的内存。
Created & Existing:创建且被存活的内存。
Created & Destroyed: 创建且被销毁的内存。
点击下方的 All Heap&Anonymous 可以对内存类型进行过滤。
All Heap & Anonymous VM:Heap 和 Anonymous VM 的总量。
All Heap:malloc分配的内存。
All Anonymous VM:mmap的匿名页。
点击下方的 Mark Snapshot 可以在时间轴上打标签。出现小旗的标志,通过标注多个时间点。点击到 Snapshot List 标签页可以看到各个时间点的内存的增长值。
火焰图的展示跟 Call Info 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,栈的所在库名,地址,大小,采集次数。
点击火焰图函数时,触发火焰图点击,显示调用栈中该函数出现在时间轴范围的分布情况。
执行搜索的关键字大小写不区分,搜索的函数的 parent 只显示搜索的 children 的大小之和,且可以与点选联动。
点击调用栈某个函数,点击函数调用的函数对应铺满画布,点击函数的 parent,显示以及绘制的大小变化为点击函数的大小,如下图点击 OHOS::EglCoreInit()函数,会显示该函数的全部调用栈。
调用栈默认会显示火焰图,新增搜索框表达式输入。表达式作用范围为 nativehook 的统计与非统计模式。其中处理的为 Responsible Library 与 Responsible Caller,其中 Responsible Library 和Responsible Caller 表示从下往上非 libc++ musl 的第一条调用栈的 lib 跟 symbol,如下图所示,由于最后一条 [ operator new(unsigned long) ] libc++.so 为 libc++.so 的函数,故跳过,所以该条调用栈的 Responsible Library 为 libhilog.so,Responsible Caller 为 OHOS::HiviewDFX::GetDomainLevel(unsigned int) 。
表达式说明: 在 InputFilter 输入框可以进行搜索过滤和表达式过滤,其中表达式必须以@开头,英文括号包起所需要过滤的内容,每个括号必须包括 (Responsible Library,Responsible Caller)匹配全量以*表示,否则认为该输入为搜索过滤。
表达式 | 含义 |
---|---|
@(libquickjs tryalloc) | 只显示 Responsible Library 为 libquickjs 且 Responsible Caller 包含 tryalloc 的数据 |
@(libquickjs *) | 只显示 Responsible Library 包含 libquickjs 的数据 |
@(* tryalloc codec bitmapcache skYUV) | 只显示 Responsible Library 为任意值 且 Responsible Caller 包含 tryalloc 或 codec 或 bitmapcache 或 skYUV 的数据 |
@(libglobal *,*resourceManager) | 只显示 Responsible Library 包含 libglobal 且 Responsible Caller 为任意值的数据 或 Responsible Library 为任意值,Responsible Caller 包含 resourceManager 的数据 |
@(/data/user *) | 只显示 Responsible Library 路径/data/user 且 symbol 为任意值的数据 |
@(mali.so *,libGLES_mali.so *) | 只显示 Responsible Library 包含 mali.so 或者 libGLES_mali.so 的数据 |
@(* PixelMap:ReadImageData) | 只显示 Responsible Caller 包含 PixelMap:ReadImageData 的数据 |
@-(libark jsvm table) | 不显示 Responsible Library 包含 libark 且 Responsible Caller 包含 jsvm 或者 table 的数据 |
@-(librender picture, libskia picture) |
不显示 Responsible Library 包含 librender 或者 libskia 且 Responsible Caller 中包含 picture 的数据 |
@-(libark *) | 不显示 Responsible Library 包含 libark 的数据 |
@-(* table) | 不显示 Responsible Caller 中 table 的数据 |
@(_ table) - (libark _) | 只显示 Responsible Caller 包含 table 且 Responsible Library 不为 libark 的数据 |
选择 Use Record Statistics 和 statistics interval 配置项抓取的数据,只会显示 Call Info 的 Tab 页,Call Info 相关功能同上。
前端可以支持多进程数据的展示,通过在 tab 页切换不同进程,可以显示不同进程的 hook 数据。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。