写点什么

资源泄漏日志采集 & 分析工具 mem-analyzer 概览和使用指导

  • 2026-09-08
    北京
  • 本文字数:3802 字

    阅读完需:约 12 分钟

AI摘要

mem-analyzer 是华为开源的轻量级资源泄漏日志采集与分析工具,聚焦解决 hidumper 和 hiprofiler 在内存快照与 Trace 采集中参数繁杂、路径不透明、配置门槛高等工程痛点。

提供标准化命令行接口,支持 JS Heap、Native Heap、FD、DMA 等多类资源快照一键采集;内置日志路径自动识别与导出机制;文档明确覆盖典型泄漏场景的分析流程。

适合 Android 系统工程师、鸿蒙应用开发者、性能优化工程师阅读。

本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:资源泄漏日志采集&分析工具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 调用链分析方法,火焰图与冰柱图:可视化调用栈泄漏分布

火焰图即上层调用链,冰柱图即下层调用链, 从顶层到底层即可看出函数调用关系,顶层是起始点。

07C6CC3A6EBB720C31AB12B17CCC0503:15823EE9332C9DD638DBC8867C55D52590A832535BC9AD56CA6A9593D9CEF6E2.20260826143339.39456908420517650096581737186887:50001231000000:2800:66E4B98B4BD3CCF7A9ADF7786B32AF8914AC4A658C537991B99CC83417EC893C.png

火焰图(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# 仅解析输出 JSONmem-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 技术交流群】