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. java——关于数组的定义 和 访问修饰符的修饰内容

    public class Shuzu { public static void main(String[] args) { // 定义数组 必须初始化长度,没有初始化要放数据 int[] in = { ...

  2. 【SpringMVC笔记】第五课 改进Handler处理器和视图解析器

    第四课 已经对注解的映射器和适配器进行了改进. 接下来需要对Handler处理器和视图解析器进行改进. <!-- 配置handler处理器 --> <bean class=" ...

  3. kafka+storm+hbase

    kafka+storm+hbase实现计算WordCount. (1)表名:wc (2)列族:result (3)RowKey:word (4)Field:count 1.解决: (1)第一步:首先准 ...

  4. CentOS 6编译安装yum和配置常用的yum源

    安装环境:VPS,CentOS 6 + devel包 一.安装相应的软件 1.安装python 下载Python源码包 [root@akinlau ~]# wget http://www.python ...

  5. hdu2896 病毒侵袭 AC自动机入门题 N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串,

    /** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串 ...

  6. 【DataStructure】Linked Data Structures

    Arrayss work well for unordered sequences, and even for ordered squences if they don't change much. ...

  7. Winform控件:保存文件对话框(SaveFileDialog)

    SaveFileDialog用于保存文件 1.新建Winform窗体应用程序,命名为SaveFileDialogDemo. 2.在界面上添加一个按钮的控件(用于打开保存文件对话框),添加文本控件,用于 ...

  8. SQLSERVER2008中创建数据库发生无法获得数据库'model'上的排他锁

    SQLSERVER2005中创建数据库发生无法获得数据库'model'上的排他锁是怎么回事? 创建数据库失败,提示无法获得数据库‘model’上的排他锁,如下图所示: 解决方法: 在查询分析器中运行如 ...

  9. Firefox 在LR录制过程中添加例外的问题解决方法

    用lr调火狐打开网页  会报证书安全问题 证书安全提示目的是告诉你这个服务器使用的证书可能不安全,要不要信任,你自己决定,不信任就不能访问.为什么会报证书安全,因为浏览器没添加该证书.或者由于性能工具 ...

  10. 如何查询表A中的某字段的值在表B中不存在?

    1.测试表创建,插入数据: create table a (id int, name )); create table b (id int); ,'a'); ,'b'); ,'c'); ,'d'); ...