使用MAT 检测内存泄漏


要分析内存泄漏,首先要了解内存使用情况,这就需要专门的工具来协助。首先要产生内存使用情况的文件(.hprof),其次用工具(MAT)来分析即可。

 

android studio eclipse都可以 产生 app内存使用情况的文件。android studio没找到视图在哪儿,这里用eclipse来生成。

 

步骤:

1:首先确保手机获得了root权限  或者准备好一个较好的模拟器。推荐Genimotion.

2:app 安装后 在设备视图中选中 进程,按照如下步骤生成 xx.hprof文件


3:下载 MAT开源工具来分析

    http://www.eclipse.org/mat/downloads.php



4:下载完成后打开 MAT,导入x.hprof文件

 

4.1  : 如果导入过程中遇到错误Error opening heap dump,解决如下

 

The hprof file you get from Android has android specific format. You should convert hprof file take from Android OS into standard hprof format.

For this you can use hprof-conv tool that is located at AndrodiSDK/tools/hprof-conv.

 

// android sdk里的工具转换一下文件即可。

hprof-conv 源文件 目标文件

 

5:选择File --> open head dump导入后 ,分析即可。







使用 MAT(Memory Analyzer Tool)分析 Java 内存泄漏是一种常见且有效的方法。以下是基于实际操作和工具特性的步骤指南: ### 1. 获取堆转储文件 首先,需要获取 Java 应用程序的堆转储文件(heap dump)。可以通过以下方式生成: - 使用 `jmap` 命令:`jmap -dump:live,format=b,file=heapdump.hprof <pid>`,其中 `<pid>` 是 Java 进程的 ID。 - 在 JVM 启动时添加参数 `-XX:+HeapDumpOnOutOfMemoryError`,这样在发生内存溢出时会自动生成堆转储文件。 ### 2. 安装和配置 MAT 工具 MAT 是一个基于 Eclipse 的工具,可以从 [Eclipse MAT 官网](https://www.eclipse.org/mat/) 下载并安装[^2]。如果堆转储文件较大,建议修改 `MemoryAnalyzer.ini` 文件以增加 MAT 的初始内存设置,以便更高效地处理大文件。 ### 3. 打开堆转储文件 启动 MAT 后,选择 "Open a Heap Dump" 选项,加载之前生成的堆转储文件。加载完成后,MAT 会显示一个概览页面,提供了一些基本信息,如堆大小、类实例数量等。 ### 4. 分析内存泄漏 MAT 提供了多种视图来帮助分析内存泄漏问题: #### 4.1 Histogram 视图 Histogram 视图展示了每个类的实例数量及其占用的内存大小。通过这个视图,可以快速识别哪些类可能占用了大量内存。点击某个类后,可以选择 "List Objects" 查看具体的对象实例。 #### 4.2 Dominator Tree 视图 Dominator Tree 视图按照对象的支配关系展示内存使用情况。它可以帮助找到那些占据大部分内存的对象,并查看它们的引用链。 #### 4.3 Leak Suspects 报告 Leak Suspects 报告是 MAT 自动生成的一个初步分析结果,通常会在打开堆转储文件后自动显示。该报告会列出一些可疑的内存泄漏点,并提供详细的解释和建议。 ### 5. 深入分析 如果初步分析未能找到明确的问题,可以进一步进行深入分析: #### 5.1 Path to GC Roots 选择某个可疑对象,右键点击并选择 "Path to GC Roots",可以查看该对象到垃圾回收根节点的路径。这有助于发现未被释放的对象是否因为存在不必要的强引用而无法被回收。 #### 5.2 Merge Shortest Paths to GC Roots 此功能可以帮助找出从 GC 根节点到可疑对象的最短路径,从而更快定位到具体的引用链。 ### 6. 修复内存泄漏 根据 MAT 提供的信息,定位到具体的代码位置,检查是否存在以下情况: - 静态集合类持有大量对象的引用。 - 监听器或回调函数未正确注销。 - 缓存未正确清理。 修复这些问题后,重新运行应用程序并再次生成堆转储文件,验证是否解决了内存泄漏问题。 ### 示例代码 以下是一个简单的示例,展示如何避免常见的内存泄漏问题: ```java public class MemoryLeakExample { private static List<String> list = new ArrayList<>(); public void addData() { for (int i = 0; i < 10000; i++) { list.add("Data " + i); } } public void clearData() { list.clear(); // 及时清理不再使用的数据 } } ``` 在这个例子中,`list` 是一个静态变量,如果不及时调用 `clearData()` 方法,可能会导致内存泄漏。因此,在不需要这些数据时,应及时调用 `clear()` 方法释放内存。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值