一、概述

在Android的开发中,经常听到“内存泄漏”这个词。“内存泄漏”就是一个对象已经不需要再使用了,但是因为其它的对象持有该对象的引用,导致它的内存不能被回收。“内存泄漏”的慢慢积累,最终会导致OOM的发生,千里之堤,毁于蚁穴。所以在写代码的过程中,应该要注意规避会导致“内存泄漏”的代码写法,提高软件的健壮性。

本文将从发现问题、解决问题、总结问题的三个角度出发,循序渐进,彻底解决“内存泄漏”的问题。

二、内存泄漏的检查工具Heap

工欲善其事必先利其器,要检测“内存泄漏”的发生,需要借助DDMS中的Heap工具及MAT工具,Heap工具用于大致分析是否存在“内存泄漏”,而MAT工具则用于分析“内存泄漏”发生在哪里。

Heap工具的使用介绍

具体操作

1.在Devices设备列表中,找到你所在的设备,点击你想要监控的进程。

2.点击“Update Heap”按钮更新堆内存的情况。

3.点击“Heap”视图,查看内存的情况。

4.每次在Activity的退出和进入的时候点击“Cause GC”,手动调用GC释放应用的内存。

5.观察data oject那一行,每一次点击“Casue GC”的时候,观察Total Size的值,如果该值不断增加,则说明该应用程序存在“内存泄漏”。

我们先模拟一下内存泄漏,然后通过Heap工具来判断一下是否存在内存泄漏。

上一段存在内存泄漏的代码:

public class LeakAty extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.aty_leak);

testLeak();

}

/**

* 测试内存泄漏的代码

*/

private void testLeak() {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();

}

上述的代码存在内存泄漏,new Runnable(){}是一个非静态的匿名内部类,所以它会强引用创建它的外围对象LeakAty,我们来测试一下内存泄漏的过程,开启手机的方向旋转功能,不断地旋转手机,让LeakAty不断地创建新的实例。理论上如果不存在上述泄漏的代码,之前的Activity会在onDestory之后被回收内存。而一旦存在上述泄漏的代码,新创建的Ruannale实例会一直处于运行状态,它不会被回收,而它强引用的LeakAty当然也不会被回收,所以在屏幕不断旋转,之前创建的LeakAty就不会被释放,会导致旋转n次,内存中就存在n+1个的LeakAty实例。

Heap工具第一次按下Cause GC按钮的截图:

上图的data object的Total Size的大小为1.031M。经过多次的旋转屏幕之后,我们再看一下截图

Total Size变成了2.059M,从1.031M到2.059M,每次调用GC的过程中data object的总大小没有回落,所以可以证实上面的代码确实是存在内存泄漏的问题,那么泄漏发生在哪里?答案可以通过MAT工具来分析得到。

三、内存泄漏的分析工具MAT

要通过MAT分析,需要提供一个.hprof文件。我们可以通过”Dump HPROF file”按钮转存当前的堆内存信息。我们将其保存为1.hprof。

导出的1.hprof的格式需要通过..\sdk\tools\目录下的hprof-conv.exe工具进行转换才能被MAT成功导入,我们将其转换成out1.hprof

将out1.hprof导入到MAT工具中,File->Open Heap Dump…

点击左边的标签Overview,Actions->Histogram

在Histogram界面中,因为我们想要知道Activity是否泄漏了,所以输入关键词Activity,然后按下回车键。

之后便可以得到Activity的相关的搜索结果,下图的搜索结果中Activity的实例有7个。点击选中下图标红色框框的地方,右键->Merge Shortest Paths to GC Roots->exclude all phantom/weak/soft etc. references。排除虚引用、弱引用、软引用的实例,剩下的都是强引用实例。

从过滤出来的强引用的列表中,我们可以看到这七个实例都是被Thread所引用了。所以证实上面的代码确实存在内存泄漏。

四、本文总结

内存泄漏检测可以使用Heap工具,内存分析可以使用MAT工具。本文的案例中提到了一种内存泄漏的情况,就是非静态内部类的对象会强引用其外围对象,一旦这个非静态内部类的实例没有释放,它的外围对象也不会释放,所以就会造成内存泄漏。下篇将具体探讨一下,在Android的开发过程中,哪些写法容易造成内存泄漏,该如何解决?请阅读Android内存泄漏终极解决篇(下)。

以上就是本文的全部内容,希望大家喜欢。

android 内存泄漏分析工具,Android内存泄漏终极解决篇(上)相关推荐

  1. android网络请求分析工具,android网络数据请求

    网络数据请求在android中应用很广泛,也很重要,所以我记录了上课讲的获取数据: 大家都知道,网络通信,发送请求有两种方式,GET和POST,这里也不例外. 1.HttpURLConnection的 ...

  2. Android游戏帧分析工具,android性能跟踪分析工具系列 - TraceView

    37624124_1408459493746.jpg 文集目录 话说前2篇都是介绍查看app 每帧的渲染,根据不同任务耗时离来查找问题,那么我们现在可以发现 app 卡顿是由哪个任务区域造成的,然后呢 ...

  3. android分析内存工具,Android Studio内存泄漏分析工具汇总

    Android Studio内存泄漏分析工具汇总 时间:2017-04-25     来源:Android开发学习网 在Android开发过程中,让人头疼的就是内存泄露问题了,很小的一个错误都会引起内 ...

  4. android内存泄漏检测工具,Android内存泄漏的检测工具——LeakCanary

    首先了解什么是内存泄露html http://liuwangshu.cn/application/performance/ram-3-memory-leak.htmlandroid 1Leakcanc ...

  5. tMemMonitor (TMM) ----- 100%正确的内存泄漏分析工具

    C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏.在大型.复杂的应用程序中, ...

  6. 内存泄漏分析工具tMemMonitor (TMM)使用简介

    内存泄漏分析工具tMemMonitor (TMM)使用简介 C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放 ...

  7. 性能分析工具 Android TraceView

    1. TraceView 简介 Traceview是android平台配备一个很好的性能分析的工具.它可以通过图形化的方式让我们了解我们要跟踪的程序的性能,并且能具体到每个方法的执行时间 Tracev ...

  8. java内存溢出分析工具:jmap使用实战

    java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap.  1 使用命令  在环境是linux+jdk1.5以上,这个工具是自带的,路 ...

  9. java hprof 分析_[转]Sun JDK自带JVM内存使用分析工具HProf

    Sun JDK自带JVM内存使用分析工具HProf 2008-10-14 11:27 Sun JDK自带JVM内存使用分析工具HProf       使用Sun JDK自带JVM内存使用分析工具HPr ...

最新文章

  1. Redis 通用 key 命令
  2. Unity Time的使用
  3. java json 教程,【简明教程】JSON
  4. 【OpenCV3】基于双目视觉的三维重建
  5. AngularJS快速上手
  6. 计算机程程序员英语,计算机程序员常用英语词汇(2)
  7. .NET Core 3.0之深入源码理解ObjectPool(一)
  8. 浅入浅出理解傅里叶变换
  9. android 定时器 坑,Android 记录一个使用AlarmManager的坑。
  10. c++ 一个线程执行结束后_告别 | 一个时代的结束:Williams家族将在蒙扎站后挥别Williams车队...
  11. 揭秘成为最牛程序员的五大要诀
  12. 蓝桥杯2016年第七届C++省赛B组第一题-煤球数目
  13. gamma分布 pytorch_pytorch之添加BN的实现
  14. 【转】RIS/PACS系统实施过程中Worklist的配置与调试
  15. 电视android怎么连接手机助手下载,投屏助手app下载 投屏助手(手机投屏到电视) for Android v2.0 安卓版 下载-脚本之家...
  16. 代码调试全指南-自然语言处理-基于预训练模型的方法,车万翔
  17. 将python图表放入ppt_如何在ppt中嵌入python图表(或图像)并刷新
  18. 全国哀悼日,网站变黑白的代码
  19. 快慢缓急总相宜|ONES 人物
  20. 移远EC20--1 AT命令初始2

热门文章

  1. 数据库主从数据一致性的几种解决方案
  2. 关于java.sql.SQLRecoverableException: Closed Connection异常的解决方案(转)
  3. STM32:ST-LINK下载弹出no target connect
  4. android 面向对象,android 面向对象六大原则
  5. 全向轮机器人运动模型及应用分析
  6. nfc和红外线的区别_红外,蓝牙,WiFi,NFC区别及优缺点
  7. qq登陆inc.php,登陆验证 qq登陆验证 php 登陆验证
  8. python动态图片转字符画_【小工具】使用python将图片转彩色字符画
  9. 洛谷——P1001 A+B Problem
  10. ❤️《AOP》(Spring必备技能)