本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:资源泄漏日志采集&分析工具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.heapsnapshot3.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.heapsnapshot3.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# 仅解析输出 JSONmem-analyzer tshandle -p -f json handle_data.zip6 步分析流水线

让 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 技术交流群】





