Eclipse内存分析工具MAT

Android Heller 354℃ 0评论

MAT (Memory Analyzer Tool) 是基于 Heap Dump 来进行分析的,所以首先必须通过一定的手段得到 Java 堆的 Dump 文件(hprof文件)。

 

一、使用 DDMS 获取 hprof 文件

在 Eclipse 里切换到 DDMS 视图或者在命令行启动 DDMS

在左边的面板选择存在内存泄露的进程,然后在工具条上边点击”Dump HPROF file“按钮。

a) 如果使用独立的MAT版本,那么会提示选择hprof文件存储位置。

b) 如果在 Eclipse 里面安装了 MAT,点击”Dump HPROF file“按钮时,首先会将 hprof 文件转换为 MAT 可以识别的格式(用hprof-conv),转换完成后会在 Eclipse 里面打开转换后的 hprof 文件(用MAT打开)。所以可以直接跳过下面的第二步。

 

二、将 hprof 文件转换为MAT可以识别的格式

在 Android SDK 的 tools 文件夹里有一个 “hprof-conv.exe” 文件,它就是 hprof 格式转换工具。

在命令行中定位到 hprof-conv.exe 文件所在目录并输入:hprof-conv 源hprof路径 目标hprof路径

 

三、使用 MAT 进行分析

启动MAT然后加载刚才我们生成的HPROF文件。

直方图(Histogram)视图。它显示了一个可以排序的类实例的列表,内容包括:shallow heap(所有实例的内存使用总和),或者retained heap(所有类实例被分配的内存总和,里面也包括他们所有引用的对象)。

如果我们按照shallow heap排序,我们可以看到byte[]实例在顶端。自从Android3.0(Honeycomb),Bitmap的像素数据被存储在byte数组里 (之前是被存储在Dalvik的heap里),所以基于这个对象的大小来判断,不用说它一定是我们泄露掉的bitmap。

右击byte[]类然后选择List Objects > with incoming references。它会生成一个heap上的所有byte数组的列表,在列表里,我们可以按照Shallow Heap的使用情况来排序。

选择并展开一个比较大的对象,它将展示从根到这个对象的路径–就是一条保证对象有效的链条。注意看,这个就是我们的bitmap缓存!

MAT不会明确告诉我们这就是泄露,因为它也不知道这个东西是不是程序还需要的,只有程序员知道。在这个案例里面,缓存使用的大量的内存会影响到后面的应用程序,所以我们可以考虑限制缓存的大小。

 

四、使用MAT比较heap dumps

调试内存泄露时,有时候适时比较2个地方的heap状态是很有用的。这时你就需要生成2个单独的HPROF文件(不要忘了转换格式),下面是一些关于如何在MAT里比较2个heap dumps的内容(有一点复杂):

1. 第一个HPROF 文件(using File —> Open Heap Dump )

2. 打开 Histogram view

3. 在Navigation History view里 (如果看不到就从Window —> Navigation History找 ), 右击histogram然后选择Add to Compare Basket

4. 打开第二个HPROF 文件然后重做步骤2和3

5. 切换到Compare Basket view,然后点击Compare the Results (视图右上角的红色”!”图标)。


转载请注明:无名小站 » Eclipse内存分析工具MAT

喜欢 (0)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址