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里一看,真相就大白了。
2.2 MAT的安装与配置
安装MAT其实很简单,但有几个坑,我当年都踩过。咱们一步步来。
2.4.1 下载与安装
- 下载地址:去Eclipse官网下载MAT。注意,它分32位和64位,现在基本都是64位了。
- 解压即用:下载下来是一个压缩包,解压到你喜欢的目录就行。比如我习惯放在
D:\tools\mat。 - 启动:双击
MemoryAnalyzer.exe(Windows)或MemoryAnalyzer(Mac/Linux)。
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(推荐日常使用)
这是最直观的方法,适合开发阶段。
- 打开Android Studio,连接设备或模拟器,运行你的App。
- 点击底部的 Profiler 标签。
- 选择 MEMORY 区域。
- 点击 Dump Java heap 按钮(那个绿色的下载图标)。
- 等待几秒钟,Android Studio会生成一个
.hprof文件,并自动打开分析视图。
但注意!Android Studio自带的分析器功能有限。我通常用它来快速预览,或者导出文件。点击左上角的 Export 按钮,选择 Export to standard .hprof,保存到本地。然后,再用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命令就派上用场了。
步骤很简单:
- 确保设备已连接,并且你的App正在运行。
- 打开终端,执行以下命令:
# 找到你的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的界面,手把手教你分析第一个内存泄漏案例。到时候,你会发现,原来内存优化也没那么神秘。