使用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
随机推荐
- Android 使用WebView控件展示SVG图
1.添加布局界面代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...
- Eclipse默认标签TODO,XXX,FIXME和自定义标签
1 TODO 表示需要实现,但目前还未实现的功能 2 XXX 勉强可以工作,但是需要改进的功能 3 FIXME 代码是错误的,不能工作,需要修复 4.自定义标签 window-->prefere ...
- Wannafly挑战赛17 A 走格子【矩阵行走/模拟】
[链接]:A [分析]:可以设置方向数组和标记数组.当不合法(越界/访问过)就转向,转向可以用now=(now+1)%4 [代码]: #include <bits/stdc++.h> #d ...
- AMQ学习笔记 - 02. JMS客户端编程模型
概述 客户端编程模型,是讲如何使用JMS API实现Java应用程序和JMS Provider的通信. 消息传送模式 消息传送模式又称为消息传送域,JMS API定义了两种模式:PTP和Pub/Sub ...
- 学习python网站
http://code.ziqiangxuetang.com/python/python-dictionary.html
- 【二维莫队】【二维分块】bzoj2639 矩形计算
<法一>二维莫队,对n和m分别分块后,对块从上到下从左到右依次编号,询问以左上角所在块编号为第一关键字,以右下角标号为第二关键字排序,转移时非常厉害. O(q*n*sqrt(n)). #i ...
- 国内流行的开源.net微信公众平台SDK对比分析
一.引言 目前微信公众平台正如火如荼的进行中,微信虽然在海外市场不敌WhatsApp,但是已经俘获了国内绝大部分用户的心.作为国内最大的,超级"app",微信已算是成功问鼎了.公众 ...
- 修改 CentOS 6.3 时区 和 时间
1.查看当前时区和时间 date -R 2.CentOS中时区是以文件形式存在,当前时区文件位于 /etc/localtime 其他时区文件位于 /usr/share/zoneinfo下,其中中国时区 ...
- js原生创建模拟事件和自定义事件的方法
让我万万没想到的是,原来<JavaScript高级程序设计(第3版)>里面提到的方法已经是过时的了.后来我查看了MDN,才找到了最新的方法. 模拟鼠标事件MDN上已经说得很清楚,尽管为了保 ...
- Linux 命令缩写部分解释
转:http://blog.chinaunix.net/uid-28408358-id-3890783.html bin = BINaries /dev = DEVices /etc = ETCe ...