使用Eclipse Memory Analyzer分析内存
1 内存泄漏的排查方法
Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,当中有两项功能可用于内存检查 :
· heap 查看堆的分配情况
· allocation tracker跟踪内存分配情况
DDMS 这两项功能有助于找到内存泄漏的操作行为。
Eclipse Memory Analysis Tools (MAT) 是一个分析 Java堆数据的专业工具。用它能够定位内存泄漏的原因。
工具地址 : http://www.eclipse.org/mat/downloads.php
1.2 利用MAT分析内存堆
DDMS 能够将当前的内存 Dump成一个 hprof格式的文件,MAT 读取这个文件后会给出方便阅读的信息,配合它的查找,对照功能,就能够定位内存泄漏的原因。
· 获取 hprof文件
点击工具栏上的 button,将内存信息保存成文件。 假设是用 MAT
Eclipse 插件获取的 Dump文件,则不须要经过转换,Adt会自己主动进行转换然后打开。
· 转换 hprof文件
DDMS Dump 出的文件要经过转换才干被 MAT识别,Android SDK提供了这个工具 hprof-conv (位于 sdk/tools下)
· ./hprof-conv xxx-a.hprof xxx-b.hprof
· 用 MAT打开转换后的 hprof文件
1.3 Histogram 查询
用的最多的功能是 Histogram,点击 Actions下的 Histogram项将得到 Histogram结果:
它按类名将全部的实例对象列出来,能够点击表头进行排序,在表的第一行能够输入正則表達式来匹配结果 :
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFhMjgzMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
在某一项上右键打开菜单选择 list objects ->with incoming refs 将列出该类的实例:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFhMjgzMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
它展示了对象间的引用关系,比方展开后的第一个子项表示这个 HomePage(0x420ca5b0)被HomePageContainer(0x420c9e40)中的 mHomePage属性所引用.
高速找出某个实例没被释放的原因,能够右健 Path to GC Roots-->exclue all phantom/weak/soft etc. reference :
得到的结果是:
从表中能够看出 PreferenceManager -> … ->HomePage这条线路就引用着这个 HomePage实例。用这种方法能够高速找到某个对象的 GC
Root,一个存在 GC Root的对象是不会被 GC回收掉的.
1.4 Histogram 对照
为查找内存泄漏,通常须要两个 Dump结果作对照,打开 Navigator History面板,将两个表的 Histogram结果都加入到 Compare
Basket中去 :
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFhMjgzMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
加入好后,打开 Compare Basket面板,得到结果:
点击右上角的 ! button,将得到比对结果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFhMjgzMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
注意,上面这个对照结果不利于查找差异,能够调整对照选项:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWFhMjgzMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" style="border:none; max-width:100%">
再把对照的结果排序,就可得到直观的对照结果:
也能够对照两个对象集合。方法与此类似,都是将两个 Dump结果中的对象集合加入到Compare Basket中去对照。找出差异后用 Histogram查询的方法找出 GC
Root。定位到详细的某个对象上。
1.5 样例
举例一个典型的分析内存泄漏的过程:
1. 使用 Heap查看当前堆大小为 23.00M
2. 加入一个页后堆大小变为 23.40M
3. 将加入的一个页删除。堆大小为 23.40M
4. 多次操作,结果仍相似,说明加入/删除页存在内存泄漏 (也应注意排除其他因素的影响)
5. Dump 出操作前后的 hprof 文件 (1.hprof,2.hprof),用 mat打开,并得到 histgram结果
6. 使用 HomePage字段过滤 histgram结果,并列出该类的对象实例列表,看到两个表中的对象集合大小不同。操作后比操作前多出一个 HomePage,说明白实存在泄漏
7. 将两个列表进行对照,找出多出的一个对象,用查找 GC Root的方法找出是谁串起了这条引用线路。定位结束
PS :
· 非常多时候堆增大是 Bitmap引起的。Bitmap在 Histogram中的类型是 byte
[],对照两个 Histogram中的 byte[]对象就能够找出哪些 Bitmap有差异
· 多使用排序功能。对找出差异非常实用
2 内存泄漏的原因分析
总结出来仅仅有一条: 存在无效的引用!
良好的模块设计以及合理使用设计模式有助于解决此问题。
3 Tips
· 使用 android:largeHeap="true"标记 (API Level >= 11)
在 AndroidManifest.xml中的 Application节点中声明就可以分配到更大的堆内存,
android:largeHeap标记在 Android系统应用中也有广泛的应用 ,比方 Launcher,
Browser这些内存大户上均有使用.
使用Eclipse Memory Analyzer分析内存的更多相关文章
- Eclipse Memory Analyzer 分析内存泄露
OutOfMemoryError示例 代码 package com.walson.heap; import java.util.ArrayList;import java.util.List; /** ...
- [转]一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
一次使用Eclipse Memory Analyzer分析Tomcat内存溢出 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序 ...
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
转:http://tivan.iteye.com/blog/1487855 前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严 ...
- 一次使用Eclipse Memory Analyzer分析Tomcat内存溢出(转)
前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...
- 使用Eclipse Memory Analyzer分析Tomcat内存溢出
前言 在平时开发.测试过程中.甚至是生产环境中,有时会遇到OutOfMemoryError,Java堆溢出了,这表明程序有严重的问题.我们需要找造成OutOfMemoryError原因.一般有两种情况 ...
- Eclipse Memory Analyzer,内存泄漏插件,安装使用一条龙
网上文档很多,但最初都有问题.整理一份,作为备份.使用过程:开发代码写完后,对可能出现内存溢出的代码,添加配置文件,生成.hprof文件,用memory Analyzer分析排查问题,且泄漏内存大小可 ...
- 使用Eclipse Memory Analyzer进行内存泄漏分析
一.准备工作 1)工具下载: http://www.eclipse.org/mat/downloads.php 可以选择eclipse插件的方式安装 http://download.eclipse.o ...
- 使用Eclipse Memory Analyzer进行内存泄漏分析三部曲
源地址:http://seanhe.iteye.com/blog/898277 一.准备工作 分析较大的dump文件(根据我自己的经验2G以上的dump文件就需要使用以下介绍的方法,不然mat会出现 ...
- 用Eclipse Memory Analyzer查找内存泄露
写在CSDN里面了 http://blog.csdn.net/dayulxl/article/details/78164301
随机推荐
- CentOS7配置阿里云yum源和EPEL源
配置阿里云yum源(参考:http://mirrors.aliyun.com/help/centos) 1.备份 [root@bogon ~]# cd /etc/yum.repos.d/ [root@ ...
- shell字符串变量的特异功能:字符串的替换(${str/源模式/目标模式},${str//源模式/目标模式})、截断
https://blog.csdn.net/wzb56_earl/article/details/6953612
- Spring:面向切片编程
在之前我们记录Spring的随笔当中,都是记录的Spring如何对对象进行注入,如何对对象的属性值进行注入,即我们讲解的很大部分都是Spring的其中一个核心概念——依赖注入(或者说是控制翻转,IOC ...
- 洛谷P2419 [USACO08JAN]牛大赛Cow Contest
对于一个能够确定名次的点,可以注意到,对于该点,入度和出度的数量加起来等于N-1(这样还是不够准确的确切的说是,能够到达这个点的数量和这个点能够到达的数量的和 floyd不仅可以求两个点之间的最短路径 ...
- Node 入门<1>
1. Node JavaScript web服务器框架,主要特点:事件驱动,异步 I/O,强制不共享任何资源的单线程,单进程系统. 每一个node进程都构成网络应用中的一个节点. ...
- Express处理GET/POST请求(POST请求包含文件)
Express处理GET/POST请求(POST请求包含文件) GET 使用简洁的pug模板引擎,写一个表单,提交方法是GET 前端页面代码 enctype,默认是application/x-www- ...
- CentOS 7 下Ansiable搭建命令列表 及常用监控指令
根据文章 [ 自动化运维工具Ansible详细部署 ] 搭建 ============================================================== 1.Ans ...
- [Codeforces 30D] Kings Problem
Brief Intro: 有n+1个点,其中n个点在X轴上,求从第k个点出发最短的汉密尔顿路径 Solution: 分类讨论+逐个枚举 设dist(i)是第i个点到n+1的距离 cal1(l,r)是n ...
- 【贪心】【multiset】 Codeforces Round #401 (Div. 2) B. Game of Credit Cards
对第一个人的排序,然后从小到大处理,对第一个人的每枚卡片,从第二个人的卡片中选择一个大于等于它的最小的,否则选择一个当前剩下的最小的,这样可以保证负场最少. 如果选择的改成大于它的最小的,就可以保证胜 ...
- 【博弈论】【SG函数】bzoj3404 [Usaco2009 Open]Cow Digit Game又见数字游戏
#include<cstring> #include<cstdio> #include<algorithm> #include<set> using n ...