资源泄漏日志采集及分析工具mem-analyzer概览和使用指导
本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:
资源泄漏日志采集&分析工具mem-analyzer概览和使用指导-华为开发者话题 | 华为开发者联盟
1、 mem-analyzer工具概览
① 工具下载:
https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer/releases
② 源码下载:
https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer
③ 使用指导:
https://gitcode.com/ancimoon/developtools_dfx_mem_analyzer/blob/master/docs/usage.md
1.1 为什么需要一个资源泄漏日志采集与分析工具
资源泄漏日志采集的痛点
• 快照采集:hidumper –mem-jsheap 功能多,但是使用门槛高。需要熟悉使用哪些参数,什么时间采集完成,日志存放在哪里,如何导出等。
• 内存Trace采集: hiprofiler命令行和IDE工具参数多(几十个参数),使用门槛高。不知道如何配置才能达到最优效果,NativeHeap、Global/LocalHandle、DMA、FD不同类型日志怎么采集也比较复杂。
资源泄漏日志分析的痛点
• 入门难:拿到一堆工具和日志文件,不知道如何开始。
• 数据多:内存trace和ArkTS堆中有海量数据,找不到重点。
• 分析难:依赖专家经验,不知道日志中哪些信息代表可能有泄漏。
• 自动化难:需写脚本分析各种日志格式,难以集成到已有的企业流水线和个人工具流程中。
mem-analyzer:一条命令,从采集到分析全链路覆盖
• 统一采集六种内存资源
• 自动识别泄漏热点
• 生成交互式HTML报告
• 支持ArkTS/Native/Handle分析
• 流水线可集成
1.2 mem-analyzer功能全景介绍
六大采集类型 · 三大分析引擎

1.3 引用链分析方法,根据根节点类型和引用路径完成问题分析
引用链:起点是根节点对象,结束点是实例对象,中间节点是引用路径,找到关键引用节点,解除引用关系。


关键分析
• ArkUI组件与ArkTS对象分析:相关组件和对象生命周期已经结束,GC后未释放的组件,建议根据引用链,找到关键节点,及时解除引用关系,避免泄漏。
• 最短引用链分析:建议先根据大小和数量等信息, 找到TOP疑点对象,然后再根据引用链,找到关键节点,及时解除引用关系,避免泄漏。
1.4 调用链分析方法,火焰图与冰柱图:可视化调用栈泄漏分布
火焰图即上层调用链,冰柱图即下层调用链, 从顶层到底层即可看出函数调用关系,顶层是起始点。
火焰图(Flame Graph)· 自顶向下

冰柱图(Icicle Graph)· 自顶向下

关键分析
•宽度代表泄漏量:方块越宽,该函数路径的泄漏越大。
•点击缩放:点击任意方块可放大该调用路径,查看更详细的子调用;右键可复制符号名和调用链。
•两种视图互补:火焰图适合看“谁调用了目标函数分配了内存”,冰柱图适合看“目标函数调用谁分配了内存”。
实际样例

2、效果展示与案例分析
2.1 ArkTS快照日志采集、分析
2.1.1 效果示例1:采集ArkTS快照,分析组件泄漏和TOP引用链
# 导出“泄漏演示”测试应用的ArkTS堆快照,自动分析后打开报告,工具会根据应用名称自动查询包名。
mem-analyzer profiler 泄漏演示 -c snapshot –o
注:快照导出仅支持debug签名应用
2.1.2 ArkTS快照日志泄漏分析(JsLeak)-AKUI组件/ArkTS对象泄漏分析
1. 通过对象名称聚类
2. 根据聚类后的总大小排序
3. 分析引用关系
4. 根据属性名判断组件类型

2.1.3 案例:通过引用链分析Ability组件泄漏
泄漏原因分析,Ability创建时将自身this放入一个对象的instance属性,后又将对象放入了一个数组,这个数组被模块级变量持有导致泄漏。

2.2 NativeHeap日志采集、分析
2.2.1 效果示例2:抓取NativeHeap内存日志,分析TOP函数与调用链
# 智能拉起应用,采集应用的内存分配栈,自动分析TOP函数与调用链,自动展示分析报告
mem-analyzer profiler 泄漏演示 -c nativeheap -o
2.2.2 Htrace日志泄漏分析-NativeHeap、DMA、FD等分析
1. 找到TOP函数,根据函数名聚类。
2. 根据聚类后的总大小排序。
3. 分析有疑点的函数的调用链,找到代码行。

2.3 ArkTS Handle日志采集、分析
2.3.1 效果示例3:抓取ArkTS Handle日志,分析Global/Local Handle
# 采集 local handle 日志时,会自动重启应用并采集
mem-analyzer profiler 泄漏演示 -c handle -o
注:ArkTS Handle日志导出需debug签名应用且系统版本7.0.0.102开始才支持
2.3.2 GlobalHandle引用ArkTS对象日志分析
1. 优化基础节点名称,根据对象名聚类
2. 根据聚类后的总大小排序
3. 分析TOP对象的引用的创建堆栈(调用链)

2.3.3 案例:分析GlobalHanlde全局句柄泄漏
泄漏原因分析,通过napi接口持有了ArkTS对象的全局句柄,但是没有调用napi_delete_reference,导致对象无法释放。

2.3.4 LocalHandle引用ArkTS对象日志分析
1. 优化基础节点名称,根据对象名聚类。
2. 根据聚类后的总大小排序。
3. 分析TOP对象的引用的创建堆栈(调用链),找到问题代码。

2.3.5 案例:分析LocalHanlde局部句柄泄漏
泄漏原因分析:在libuv中通过napi接口创建对象,创建String没有被napi_open_handle_scope包含,造成永久泄漏。
1. 通过堆栈可以找到创建相关ArkTS对象的底层函数。
2. 通过对象名可以找到具体的ArkTS对象。

2.4 已有堆快照日志分析
2.4.1 效果示例4:直接分析已有的堆快照
# 分析已导出的快照,并自动打开分析报告
./mem-analyzer jsleak ~/Downloads/hidumper-jsheap-63074-63074-1787051285526.rawheap –o
2.4.2 ArkTS快照日志泄漏分(JsLeak)-最短引用链分析
1. 优化基础节点名称,分析节点最短引用链。
2. 根据引用链聚类。
3. 根据聚类后的总大小排序,分析有疑点的节点数和引用链。

2.4.3 通过资料文档可以快速找到更多资料,通过帮助中心可以快速开始

3、使用指导和模块介绍
3.1 mem-analyzer解压即用,一条命令出报告
安装
解压对应平台压缩包即可使用:
Windows: mem-analyzer.exe
macOS: ./mem-analyzer (arm64/x86_64)
Linux: ./mem-analyzer
命令结构
mem-analyzer [全局选项] [子命令] [选项] <文件…>
全局选项: -d 输出目录 -p 仅解析 -o 自动打开 -f json/html
子命令: profiler / trace / tshandle / jsleak(不指定则自动检测)
常用命令示例
# 采集60秒 nativeheap(nh) 并自动生成报告
mem-analyzer profiler -c nh -t 60 -o com.example.app
# 自动检测文件类型并分析
mem-analyzer -o hiprofiler_data.htrace
# 分析堆快照,显示 Top 20 引用链
mem-analyzer jsleak -n 20 -o hidumper-jsheap.heapsnapshot
3.2 日志采集模块—profiler
profiler:一条命令完成设备端采集与分析
核心能力
• 环境自检:hdc可用性 / 设备连接 / API版本
• 进程名解析:支持包名或应用名模糊匹配
• 应用自动拉起,采集期间随时 Ctrl+C 停止
• -o 参数:采集后自动生成 HTML 报告并打开
采集命令示例
# 采集60秒 nativeheap(nh),自动出报告
mem-analyzer profiler -c nh -t 60 -o 泄漏演示
# 采集 ArkTS 堆快照(应用需已运行)
mem-analyzer profiler -c snap -o com.example.app
# 列出设备上已安装的应用
mem-analyzer profiler –list-apps
采集流程四步走

3.3 ArkTS快照分析模块—jsleak
jsleak:ArkTS堆快照泄漏分析,组件泄漏分析与最短引用链分析
三大核心分析能力
• 组件泄漏识别— 识别 isDeleting_ / _isDisposed / isDestroyed 标记的已销毁组件对象
• 最短引用链分析—计算保留大小
• 特殊对象易用改进-JSObject(增加属性数量,关键属性显示),String显示长度,Observed对象(增加显示业务对象名称)

分析模式与命令(-m)
• all(默认)— 属性标签 + 引用链全分析
• property-tag / pt— 仅属性标签检测
• top-chain / tc— 仅最短引用链
# 分析堆快照,自动打开报告
mem-analyzer jsleak -o xxx.rawheap
# Top 20 引用链 + 自定义泄漏定义文件
mem-analyzer jsleak -n 20 -l my_leaks.jsleaklist xxx.heapsnapshot
3.4 内存分配日志分析模块—trace
trace:内存分配日志(htrace)分析与泄漏热点识别
支持的资源类型(-c)
• nativeheap — malloc/free 堆内存
• dma — DMA(ION)内存
• ashmem — 匿名共享内存
• fd — 文件描述符
• thread — 线程
四种分析范围 (-s)
• app-only — 仅应用层符号
• system-only — 仅系统层符号
• app-and-system — 同时显示(默认)
• mixed — 跨层混合符号
命令示例
# 仅分析应用层符号,并输出top20的结果
mem-analyzer trace -c nativeheap -s app-only -n 20 leak.htrace
# 仅解析htrace,将输出json格式的原始调用链
mem-analyzer trace -p data.htrace
分析思路:以函数为核心,先找出TOP泄漏量的函数,再构建TOP函数的上下游调用链
海量原始调用栈

TOP1 泄漏量函数 caller()

3.5 ArkTS Handle日志分析模块—tshandle
tshandle:ArkTS 对象Global/LocalHandle泄漏分析

命令示例
# 生成完整 HTML 分析报告
mem-analyzer tshandle handle_data.zip
# 仅解析输出 JSON
mem-analyzer tshandle -p -f json handle_data.zip
6步分析流水线

让 HarmonyOS 应用告别内存泄漏,运行更加流畅稳定,欢迎随时交流提问,共同探索技术优化的无限可能。

mem-analyzer资源泄漏日志抓取与分析
—————————————————————————————————–
🔗 官网开发者学堂视频:https://developer.huawei.com/consumer/cn/training/result?type2List=201783644516849879&orderBy=1&courseType=5

🔗 社区DFX专题文章: https://developer.huawei.com/consumer/cn/forum/subject/2101218731402391001


【扫码加入 HarmonyOS DFX 技术交流群】
本文由 @华为开发者联盟 授权发布于人人都是产品经理。未经作者许可,禁止转载
题图来自Unsplash,基于CC0协议
该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务
- 目前还没评论,等你发挥!

起点课堂会员权益




