Overview

MAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗。分析Process showmap中的/dev/ashmem/dalvik-heap(deleted)一项所占用的Memory.可以参考我写的使用showmap分析系统内存占用情况一文。

下面就将一下如何使用Eclipse MAT分析Android应用程序内存的消耗。所需要的是已经安装ADT和SDK的Eclipse.然后可以在http://www.eclipse.org/mat/ 下载MAT插件将MAT安装在Eclipse上。

如下图所示,手机连接电脑,打开Eclipse,进入DDMS中,选择一个进程,可以看到下面的

画面:

update
Heap键的作用是立即更新,使工具可以获得手机上运行的Android应用程序的最新Heap分配状况。dump Hprof键则可以立即dump
Hprof文件(Java Heap 分配信息存储在Hprof文件中)。 Cause GC键主要就是强制引发一次GC(垃圾回收)。

点击dump Heap键,我们会看到如下画面:

这个就是Eclipse中Hprof文件分析界面的主页面了。

其中Histogram可以看到所有实例的分配情况, Dominator Tree列出了堆的最大对象。 Leak Suspects主要是列出怀疑的内存泄露处。

Histogram

首先,我们来看一下Histogram,

这个列出了所有实例类型,右键选中实例类型Byte,选择Merge
Shortest Paths to GC Root,然后选择excluse all phantom/weak/soft etc
refereneces. Merge Shortest Paths to GC Root主要显示最短离GC
Root的路径。Java的垃圾回收机制简单来说有点类似树的深度遍历方式,如果一个对象有引用,则GC
Root到这个对象之间是有路径可达的。如果GC Root到 这个对象之间无任何路径可达,则这个对象是不可触及的,是可以回收的。exclude
all phantom/weaker/soft etc
references则是排除虚引用,弱引用及软引用。因为这些引用一般是可以回收的。 (详细解释请参考深入Java虚拟机 垃圾回收一章)。

然后可以可以看到如下画面:

其中可以看到Resources类中有个sPreloadedDrawables的LongSparseArray对象,sPreloadedDrawables中有个mValues的Object数组,数组第139个个元素是一个NiePatchDrawable的对象,这个对象有个mNinePatch的对象,mNinePatch则有一个mChunk的Byte数组的引用。

可能大家已经注意到图中有个Shallow heap和Retained Heap, 具体代表什么意思呢?简单来讲,Shallow Heap Size是对象自身占用的Size。 Retained Heap Size是对象自身的Shallow Size +对象直接引用或者间接引用的对象的Shallow Size。

然后结合代码可以分析出来这个Byte数组是如何引用的,以及这个Byte数组是什么时候创建和销毁的,其创建和销毁是否是合理的。

假如说上面对象此时本来应该是被GC掉的,那么我们应该如何处理了。简单的办法就是将其中的某处置为null或者remove掉,使其到GC Root无路径可达,处于不可触及状态,垃圾回收器就可以回收了。

由于有很多对象,为了分析方便,我们可以点击Cause GC键使其强制发生一次GC,这样可以减少对象的个数,便于我们分析。

Leak Suspects

Leak Suspects列出了工具怀疑的内存泄露点。

在下图中,MAT工具怀疑第一个问题有1.5M的内存泄露:

然后接着,是问题一的描述,列出了一些比较大的实例。

点击Details可以看到细节信息。

不过工具怀疑的也未必真的是存在的,但提供了一种参考。

参考:http://help.eclipse.org/kepler/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html

http://www.eclipse.org/mat/about/screenshots.php

http://plumbr.eu/blog/how-much-memory-do-i-need-part-2-what-is-shallow-heap

http://joeylittlefat.diandian.com/post/2011-09-27/5340625

使用MAT分析Java内存的更多相关文章

  1. 利用MAT分析JVM内存问题,从入门到精通(二)

    上一篇文章MAT入门到精通(一)介绍了MAT的使用场景和基本概念,这篇文章开始介绍MAT的基本功能,后面还有两篇,一篇是MAT的高级功能,另一篇是MAT实战案例分析. 三.欢迎页 使用MAT打开一个h ...

  2. GC root & 使用MAT分析java堆

    当我们的java程序遇到频繁full gc或者oom的时候,我们常常需要将当前的heap dump出来进行进一步的分析.MAT是用于分析heap dump的神器. 1 生成heap dump heap ...

  3. 分析java内存情况

    使用pmap查看进程内存 运行命令 使用pmap可以查看某一个进程(非java的也可以)的内存使用使用情况, 命令格式: pmap 进程id 示例说明 例如运行: pmap 12358 显示结果如下图 ...

  4. mat工具MemoryAnalyzer进行分析java内存溢出hprof文件

    java服务端程序报错后会生成hprof文件,我们可以通过mat工具MemoryAnalyzer进行分析 下载地址: http://www.eclipse.org/mat/downloads.php ...

  5. MAT分析android内存泄漏

    转载请标明出处:https://www.cnblogs.com/tangZH/p/10955429.html 泄漏,泄漏,漏~ 内存泄漏怎么破,什么是内存泄漏?与内存溢出有什么区别? 内存泄漏(Mem ...

  6. 从一个OutOfMemoryError 学会了分析Java内存泄漏问题

    以前都是好好的,最近出现了 oom. 问题 开始是: java.lang.OutOfMemoryError: Java heap space -- :: --- [nio--exec-] c.e.p. ...

  7. 如何分析java内存泄漏问题

    java中的内存泄漏首先需要dump文件出来,主要包括内存dump.线程dump: 内存dump是指通过jmap -dump <pid>输出的文件,而线程dump是指通过jstack &l ...

  8. 使用Xmanager分析Java内存情况

    今天是想看下程序在正式环境中,内存使用回收的情况,于是开始. 1.首先下载Xmanager,Xshell,然后在Xshell-设置-隧道中设置转发X11连接到Xmanager: 2.开始布置Linux ...

  9. MAT工具定位分析Java堆内存泄漏问题方法

    一.MAT概述与安装 MAT,全称Memory Analysis Tools,是一款分析Java堆内存的工具,可以快速定位到堆内泄漏问题.该工具提供了两种使用方式,一种是插件版,可以安装到Eclips ...

随机推荐

  1. 【C】——回调函数实现泛型算法

    回调函数的一个典型应用就是实现类似C++的泛型算法(Generics Algorithm).下面实现的max函数可以在任意一组对象中找出最大值,可以是一组int.一组char或者一组结构体,但是实现者 ...

  2. centos7 firewalled

    FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain). 默认情况下,有以下的区域(zone)可用: drop – 丢弃所有传 ...

  3. EasyUI-datagrid中load,reload,loadData方法的区别

    EasyUI比较常用,其中的datagrid比较复杂,它有其中有load,reload,loadData这三个方法,它们都有相同的功能,都是加载数据的,但又有区别. load方法,比如我已经定义一个d ...

  4. AJAX乱码解决新方法

    用过AJAX的朋友肯定知道javascript是使用UTF-8国际编码,即每个汉字用3个字节来存储,但是这就造成了用AJAX来send数据的时候出现乱码.     有一种解决办法就是使用encodeU ...

  5. 统一建模语言 UML

    目录 统一建模语言 UML UML定义了5类10种模型图 一用例图用于建立需求模型 二静态图主要描述系统的静态表示和关系包括类图包图对象图 三行为图描述系统动态模型和对象组成的交换关系包括状态图和活动 ...

  6. WaitForSingleObject()

    参见:http://blog.csdn.net/xiaobai1593/article/details/6672193 1. 格式 DWORD WaitForSingleObject( HANDLE  ...

  7. 建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法

    建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法. #include <iostream> /* run this program using the console pau ...

  8. 利用Graphviz 可视化GO 数据库

    GO是一个同源蛋白的数据库,按照三大类别BP(生物学过程), MF(分子功能), CC(细胞组分) 对基因的产物-蛋白质进行了分类: 在GO数据库中,本质上是一个有向无环图的数据结构,在三大类别之下, ...

  9. VNC轻松连接远程Linux桌面(1)

    Linux平台安装VNCServer Windows平台使用VNC-Viewer 方法/步骤     在Linux平台安装VNCServer服务端软件包. #yum -y install vnc *v ...

  10. php jquery pjax示例源码 (ajax请求,并改变url)

    下载地址: http://files.cnblogs.com/files/gaocong/jquery_pjax.rar