【Android】Eclipse Memory Analyzer 进行堆内存溢出分析
MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件。
1.一键式的堆存储分析功能
首先,启动安装配置好的 Memory Analyzer tool , 然后选择菜单项 File- Open Heap Dump(eclipse会自动载入)来加载需要分析的堆转储文件。
文件加载完成后,你可以看到如下图所示的界面
通过上面的概览,我们对内存占用情况有了一个总体的了解。
另外,MAT 工具提供了一个很贴心的功能,将报告的内容压缩打包到一个 zip 文件,并把它存放到原始堆转储文件的存放目录下,这样如果您需要和同事一起分析这个内存问题的话,只需要把这个小小的 zip 包发给他就可以了,不需要把整个堆文件发给他。并且整个报告是一个 HTML 格式的文件,用浏览器就可以轻松打开。
接下来我们就可以来看看生成的报告都包括什么内容,能不能帮我们找到问题所在吧。您可以点击工具栏上的 Leak Suspects 菜单项来生成内存泄露分析报告,也可以直接点击饼图下方的 Reports->Leak Suspects 链接来生成报告。
2.分析三步曲
通常我们都会采用下面的“三步曲”来分析内存泄露问题:
- 首先,对问题发生时刻的系统内存状态获取一个整体印象。
- 第二步,找到最有可能导致内存泄露的元凶,通常也就是消耗内存最多的对象
- 接下来,进一步去查看这个内存消耗大户的具体情况,看看是否有什么异常的行为。
下面将用一个基本的例子来展示如何采用“三步曲”来查看生产的分析报告。
2.1 查看报告之一:内存消耗的整体状况


2.2 查看报告之一:分析问题的所在
现在,让我们开始真正的寻找内存泄露之旅,点击“Details ”链接,可以看到如下图所示对可疑对象的详细分析报告。


我们可以很清楚的看到整个引用链,内存聚集点是一个拥有大量对象的集合,如果你对代码比较熟悉的话,相信这些信息应该能给你提供一些找到内存泄露的思路了。
接下来,我们再继续看看,这个对象集合里到底存放了什么,为什么会消耗掉如此多的内存。
在这张图上,我们可以清楚的看到,这个对象集合中保存了大量图片对象的引用,可能就是它导致的内存泄露等问题。
再仔细看......
实际上这些位图真正占用的内存只有一丁点,但是java虚拟机为其保留了70%的内存备用,这些内存没有被回收,所以利用率几乎为 0 !
从此处大家都可以知道了,应用里面图片多了其实是一件悲剧的事,至少可能会给应用带来许多不可预知的问题,而且在图片方面的内存优化是比较麻烦的,哎,最近搞内存泄露,涉及到动态库,JNI,多线程,资源同步与竞争等,蛋疼的事 ......
有些图片为Android预加载部分的,具体可参看下面网址:http://stackoverflow.com/questions/9653457/locating-and-remedying-cause-of-large-heap-size
@成鹏致远
(blogs:lcw.cnblogs.com)
(email:wwwlllll@126.com)
(qq:552158509)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架