2、MAT基础入门:MAT是什么、MAT的安装与配置、Heap Dump文件获取

大家好,欢迎来到《内存优化工具Mat与Perfetto实战》的第二讲。

今天咱们聊聊MAT。嗯,这个工具,可以说是Android内存优化的“老大哥”了。我入行那会儿,还没有Perfetto这么时髦的东西,排查内存泄漏全靠它。虽然现在工具多了,但MAT的地位依然不可撼动。说白了,它是你分析堆内存的“手术刀”,精准、锋利。

2.1 MAT是什么?

MAT,全称是Memory Analyzer Tool。它是Eclipse基金会下的一个开源项目。你想想看,一个Java堆转储文件(Heap Dump)动辄几百兆,甚至上G,光靠人眼去看,根本不可能。MAT就是帮你从这堆“垃圾”里,快速找到问题根源的利器。

它能做什么?我总结了几点:

  • 分析大对象:一眼看出哪个对象占用了最多的内存。
  • 追踪引用链:从GC Roots到某个对象的完整路径,帮你定位泄漏点。
  • 计算保留集:精确算出如果回收某个对象,能释放多少内存。
  • 自动检测泄漏:提供“嫌疑犯”列表,虽然不一定全对,但能给你方向。

我个人习惯,把MAT当作“最终裁决者”。当你用Android Studio Profiler觉得某个地方不对劲,但又拿不准时,导出Dump文件,丢进MAT里一看,真相就大白了。

核心观点: MAT不是用来监控实时内存的,它是用来做“事后分析”的。就像法医解剖,你得先有“尸体”(Heap Dump),才能做鉴定。

2.2 MAT的安装与配置

安装MAT其实很简单,但有几个坑,我当年都踩过。咱们一步步来。

2.4.1 下载与安装

  1. 下载地址:去Eclipse官网下载MAT。注意,它分32位和64位,现在基本都是64位了。
  2. 解压即用:下载下来是一个压缩包,解压到你喜欢的目录就行。比如我习惯放在 D:\tools\mat
  3. 启动:双击 MemoryAnalyzer.exe(Windows)或 MemoryAnalyzer(Mac/Linux)。
避坑指南: 我曾经在Mac上直接双击启动,结果报错“Failed to create the Java Virtual Machine”。这是因为MAT默认分配的堆内存太小了。别慌,往下看配置。

2.4.2 内存配置(关键!)

MAT本身也是一个Java程序,它分析大Dump文件时,需要足够的内存。默认的512M肯定不够用。

你需要修改配置文件:

  • Windows:编辑 MemoryAnalyzer.ini 文件。
  • Mac/Linux:编辑 MemoryAnalyzer.ini 文件。

找到 -Xmx 这一行,改成你需要的值。我个人建议:

-Xmx4g  # 如果你的Dump文件在500M以内,4G够用
-Xmx8g  # 如果Dump文件超过1G,建议8G或更高

嗯,这里要注意,你的电脑物理内存要够。我见过有人给MAT分配了16G,结果自己电脑卡死了。量力而行。

2.4.3 验证安装

启动MAT后,你会看到一个简洁的界面。点击菜单栏 Help -> About Memory Analyzer,能看到版本信息,就说明装好了。

2.3 Heap Dump文件获取

有了工具,还得有“食材”。Heap Dump文件怎么来?主要有两种方式:Android Studio Profiler 和 adb 命令。我两种都用,但场景不同。

2.3.1 使用Android Studio Profiler(推荐日常使用)

这是最直观的方法,适合开发阶段。

  1. 打开Android Studio,连接设备或模拟器,运行你的App。
  2. 点击底部的 Profiler 标签。
  3. 选择 MEMORY 区域。
  4. 点击 Dump Java heap 按钮(那个绿色的下载图标)。
  5. 等待几秒钟,Android Studio会生成一个 .hprof 文件,并自动打开分析视图。

但注意!Android Studio自带的分析器功能有限。我通常用它来快速预览,或者导出文件。点击左上角的 Export 按钮,选择 Export to standard .hprof,保存到本地。然后,再用MAT打开这个文件。

小技巧: Android Studio导出的.hprof文件是Android格式的,MAT不能直接打开。你需要用 sdk\tools\bin\ 下的 hprof-conv 工具转换一下。命令如下:
hprof-conv -z input.hprof output.hprof
不过,新版的MAT已经支持直接打开Android格式的.hprof了。如果你打不开,记得先转换。

2.3.2 使用adb命令(适合自动化或线上问题)

有时候,App跑着跑着突然OOM了,你来不及连Profiler。或者你想在自动化测试中抓取Dump。这时候,adb命令就派上用场了。

步骤很简单:

  1. 确保设备已连接,并且你的App正在运行。
  2. 打开终端,执行以下命令:
# 找到你的App进程ID
adb shell ps | grep com.your.package.name

# 假设PID是 12345,执行Dump
adb shell am dumpheap 12345 /data/local/tmp/heapdump.hprof

# 或者直接通过包名(更常用)
adb shell am dumpheap com.your.package.name /data/local/tmp/heapdump.hprof

# 将文件拉到电脑上
adb pull /data/local/tmp/heapdump.hprof D:\dumps\

为什么会用这种方式?我记得有一次,用户反馈某个页面操作后内存暴涨,但在我自己的手机上复现不了。我就写了个脚本,让测试同学在用户手机上执行这几条命令,把Dump文件拉回来。嗯,问题很快就定位到了。

注意: 执行 dumpheap 命令时,App会短暂卡顿,因为要冻结所有线程来生成堆快照。线上操作要谨慎,最好在用户不操作的时候进行。

2.3.3 两种方式对比

方式 优点 缺点 适用场景
Android Studio Profiler 可视化操作,简单直观,可实时观察 依赖IDE,不适合自动化 开发阶段、本地调试
adb命令 无需IDE,可脚本化,适合远程操作 需要手动输入命令,无法实时预览 自动化测试、线上问题排查

好了,这一章的内容就到这里。总结一下:我们知道了MAT是什么,学会了安装配置,也掌握了两种获取Heap Dump文件的方法。下一章,我会带你真正走进MAT的界面,手把手教你分析第一个内存泄漏案例。到时候,你会发现,原来内存优化也没那么神秘。