转载请注明出处 http://www.cnblogs.com/weiwangnuanyang/p/5703702.html

如果只是想确定一下某一个场景是否有内存泄漏,AndroidStadio的控制台就有一个好工具,反复操作观察曲线是否上扬,如果曲线上扬则说明内存泄漏

点击旁边第三个按钮也可以生成hprof文件。不过本人比较习惯用Eclipse,这里就以Eclipse为例啦。

下面就来重点介绍一下如何利用Memory Analysis(Eclipse的一个插件,具体安装方式请移步度娘)  生成  和  分析  hprof文件。

1. 生成hprof文件。

生成hprof文件很简单,在Eclipse的DDMS视图内,点击你需要调试的进程,然后点击[DUMP HPROF FILE]按钮就好啦。

对于内存泄漏问题一般是需要对比分析的,所以如果没有自动化测试环境的话,手动测试可以在进入app时存一个hprof文件,

然后开始反复测试泄漏的场景20+次,存一个hprof文件,再反复操作20+次,再存一个hprof文件。

2. 简单介绍。

下面是打开一个hprof文件后的概览视图。

从此概览视图中我们可以以此看到

Details(细节):展示了总大小,classes大小,objects大小, classloader 数量;unreachable objects histogram(可被回收对象柱状图);

Biggest Objects by Retained Size(占用内存最大对象饼状图);

Histrogram(柱状图):列举每个类的对象个数;

Dominator Tree(支配树): 列举最大的对象,和因为类而引起的不能回收的对象占用空间大小;

Top Consumers(最大的消费者): 列举占用内存最大的对象的饼图;

Duplicate Classes:检测由多个类加载器加载的类;

Leak Suspects:包括一个简单的泄漏分析和一个系统概述;

Top Components: 列举在堆中大小大于总大小1%的组件,以class loader 分类(system class loader,PathClassLoader,DexClassLoader);

Component Report: 分析属于common root package 或者 class loader的对象。

面板上面还有一些按钮提供了根据地址搜对象,查看线程详细信息,生成报表等功能。具体的大家点点看看就ok了。

3. 分析hprof文件实战。

以本人有限的分析内存泄漏的经验来看,Memory Analysis提供的Leak Suspects往往都是不准确的,它的分析是基于类的对象在内存中占用的总大小,

总是把一些系统类比如byte列举在第一位。就像下面这样。

所以真正的有效分析还得靠自己。

要解决java内存泄漏的问题,首先要了解java中哪些情况会造成内存泄漏,具体请移步  http://www.cnblogs.com/weiwangnuanyang/p/5704596.html ;

分析内存问题,一个非常有效的方法就是对比开始测试和结束测试时的类的个数。然后再分析这些类的引用关系。

下面就以一个实例来说一下。

第一步:生成两个文件并打开,如下有17:55:55和18:00:29的两份文件。

第二步:打开第二个文件的类柱状图。

打开以后是这样的:

第三步:点击Histogram上面的对比按钮,与另一份文件做对比。

这时候得到的结果是这样的:

第四步:在<Regex>的输入框里输入你的包名关键字,筛选出你自己的类,过滤掉系统类。

这时候那些类泄漏了就非常明晰了。反复操作n次就增加了n+个的类多半都是有问题的。

第五部:分析这些类的引用关系。在这个对比表里点击右键是没有效果的,你需要打开一个新的Histogram视图,同样用你的包名筛选出你写的类。

然后选中一个点击右键,这时候会出来一个菜单,菜单中前三项分别表示对象的引用关系,类的引用关系,类的回收路径。

我们选择类的Merge Shortest Path to GC Root(最短回收路径)来看一下,点开以后的结果是这样的:

首先可以看到有一大片InnerReceiver,这个肯定是有问题的,点开其中一个可以看到最后一个我们自己的类是BNavigator,点开这个类可以看到它注册了

广播但是没有反注册。

然后再看一下其他没有回收的对象,下面这个是因为MapController引用了CarNaviAcitity的Context,而MapController是一个Map的key.

这里有两个问题需要考虑,其一是MapController作为key是否是合适的,当它作为key时是否在无用时及时从Map中移出;其二是MapController引用了CarNaviActivity的

Context,而不是ApplicationContext,这是造成anroid的Activity泄漏的一个主要原因。

再来看SurfaceView也是引了Activity的Context.

对于其他类的分析类似,在此不一一列举了。

【原创】android内存管理-hprof文件的更多相关文章

  1. Android 内存使用hprof文件打开方法

    http://blog.csdn.net/moruihong/article/details/7677128 与C++的内存不同,C++的内存泄露是由于分配了内存给某程序但是又没有回收造成的.Java ...

  2. Android 内存管理分析(四)

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

  3. [Android Memory] Android内存管理、监测剖析

    转载自:http://blog.csdn.net/anlegor/article/details/23398785 Android内存管理机制: Android内存管理主要有:LowMemory Ki ...

  4. Android内存管理机制之一:low memory killer

    转载自http://www.miui.com/thread-29268-1-1.html 准备写这个专题之前,心里是有点忐忑的.首先Android内存管理机制相当复杂,想要讲清楚比较困难:其次对于绝大 ...

  5. 浅谈Android内存管理

    最近在网上看了不少Android内存管理方面的博文,但是文章大多都是就单个方面去介绍内存管理,没有能全局把握,缺乏系统性阐述,而且有些观点有误,仅仅知道这些,还是无法从整体上理解内存管理,对培养系统优 ...

  6. 移动端测试===Android内存管理: 理解App的PSS

    Android内存管理: 理解App的PSS 原文链接:http://www.littleeye.co/blog/2013/06/11/android-memory-management-unders ...

  7. Android——内存管理基础

    内存收集概念 内存垃圾收集器(garbage collector) 概念:自定内存管理. 功能:分配内存.保证所有被引用的对象还在内存中.可以释放在运行的代码中不再引用的对象的内存. 垃圾收集器避免了 ...

  8. Android内存管理(12)*「实例」用Monitor 生成.hprof文件 并分析内存泄漏

    参考 http://blog.csdn.net/xiaanming/article/details/42396507 基本步骤: 1,准备一个有内存泄漏的代码 2,如何发现内存泄漏 3,生成.hpro ...

  9. 【原创】Android内存管理-OnTrimMemory

    Application中有两个与内存管理相关的方法:onLowMemory()和 onTrimMemory(int level),源码如下 @CallSuper public void onLowMe ...

随机推荐

  1. tomcat7 启动项目报错 java.lang.NoSuchMethodError: javax.servlet.ServletContext.getSessionCookieConfig()

    JDK版本:jdk1.8.0_77 Tomcat 版本:apache-tomcat-7.0.47 异常重现步骤: 1.完成项目部署 2.启动Tomcat 异常头部信息:java.lang.NoSuch ...

  2. 2016HUAS_ACM暑假集训4C - 递推

    题目大意:给你一个高为n ,宽为m列的网格,计算出这个网格中有多少个矩形. 这里我们可以这样看: 对于行:假如是m单位长度,则长度为1的矩形有m个,长度为2的矩形有m-1个......长度为m的只有1 ...

  3. statsd+graphite

    一些观点: Statsd:一个nodejs的客户端,用于向graphite的收集器发送数据,使用各类编程语言的客户端响起发送timer,counter等统计数据后,其通过udp定时向graphite发 ...

  4. 如何写出优雅的CSS代码 ?(转)

    对于同样的项目或者是一个网页,尽管最终每个前端开发工程师都可以实现相同的效果,但是他们所写的代码一定是不同的.有的优雅,看起来清晰易懂,代码具有可拓展性,这样的代码有利于团队合作和后期的维护:而有的混 ...

  5. Mac系统终端命令行不执行命令 总出现command not found解决方法

    配置过安卓开发环境,改过bash_profile这个文件,最后不知怎么的只有cd命令能执行,我猜测可能修改bash_profile文件后没有保存 导致的     保存命令是:  source .bas ...

  6. while 循环的使用

    以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么返回 true.COUNTER从0开始,每次循环处理时,COUNTER加1.运行上述脚本,返回数字1到5,然后终止. COUN ...

  7. SQLSERVER 复制同一张表的递归结构

    CREATE PROCEDURE [dbo].[Pro_Copy] @OLDJiFenSeriesId VARCHAR(), @NEWJiFenSeriesId VARCHAR() AS BEGIN ...

  8. C++中利用数组对字符进行除重和排序

    题目:随机输入一组字符,对这组字符进行除重和排序输出, 例如:输入aafddbc 输出:abcdf 程序: #include "stdafx.h"#include<iostr ...

  9. 真机测试-Please enter a different string错误解决

    错误原因是这个bundle ID已经被占用了,这是想到的是要重置测试证书,那么则需要去修改Bundle identifier,因为测试证书是以Bundle identifier为基准的,修改后运行,重 ...

  10. 使用curl命令获取文件下载速度

    使用curl可以下载网络内容,那如何获取curl下载时的下载速度呢,使用下面的命令即可: # curl -Lo /dev/null -skw "%{speed_download}\n&quo ...