使用 Android Studio 检测内存泄漏与解决内存泄漏问题

  

  本文在腾讯技术推文上 修改 发布。  

  http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BFT.PARAMS.195040.TASKID&ADUIN=913337456&ADSESSION=1468996652&ADTAG=CLIENT.QQ.5431_.0&ADPUBNO=26510

  自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclipse,成为主流的Android开发IDE。Android Studio在为我们提供了良好的编码体验的同时,也提供了许多对App性能分析的工具,让开发者可以更方便分析App性能。Google在IO大会上一直告诫开发者不要无节制的使用手机内存,要注意一些不良的开发习惯会导致App的内存泄漏。虽然如今网上检测App内存泄漏的文章汗牛充栋,但是要使用DDMS和MAT,不仅使用步骤复杂繁琐,而且要手动排查内存泄漏的位置,操作起来多有不便。其实Android Studio已经开始支持自动进行内存泄漏检查了,本文就带着大家一探其中的奥妙吧。

什么是内存泄漏
  这个也是个面试常客,通俗来说,定义了的变量没使用,就是内存泄漏了。Android虚拟机的垃圾回收采用的是根搜索算法,还一种是程序计数器算法。GC会从根节点(GC Roots)开始对heap进行遍历。到最后,部分没有直接或者间接引用到GC Roots的就是需要回收的垃圾,会被GC回收掉。而内存泄漏出现的原因就是存在了无效的引用,导致本来需要被GC的对象没有被回收掉。

举个例子

mLeak是存储在静态区的静态变量,而Leak是内部类,其持有外部类Activity的引用。这样就导致Activity需要被销毁时,由于被mLeak所持有,所以系统不会对其进行GC,这样就造成了内存泄漏。

再举一个最常犯的例子

  如果我们在在调用Singleton的getInstance()方法时传入了Activity。那么当instance没有释放时,这个Activity会一直存在。因此造成内存泄露。
解决方法可以将new Singleton(context)改为new Singleton(context.getApplicationContext())即可,这样便和传入的Activity没关系了。

内存泄漏的检测
  打开Android Studio,编译代码,在模拟器或者真机上运行App,然后点击,在Android Monitor下点击Monitor对应的Tab,进入如下界面

  在Memory一栏中,可以观察不同时间App内存的动态使用情况,点击可以手动触发GC,点击可以进入HPROF Viewer界面,查看Java的Heap,如下图

  Reference Tree代表指向该实例的引用,可以从这里面查看内存泄漏的原因,Shallow Size指的是该对象本身占用内存的大小,Retained Size代表该对象被释放后,垃圾回收器能回收的内存总和。
下面我们以掌上道聚城客户端为例,来一探内存泄漏检测的方法。
  打开Android Studio,编译代码,运行掌上道聚城,然后开始尽情的耍我们的App啦,然后就从Memory Monitor里面观察App的内存使用曲线,突然发现,纳尼!!!怎么内存使用越来越大了,这就很有可能是发生内存泄漏了,然后点击手动进行GC,再点击观看JavaHeap,点击Analyzer Task,Android Monitor就可以为我们自动分析泄漏的Activity啦,分析出来如下图所示

  在Reference Tree里面,我们直接就可以看到持有该Activity的单例对象,直接定位到该单例中的代码,发现代码中出现了

  

  和刚刚举得例子里出现的错误一模一样,我们修复了检查出的内存泄漏的问题,并将修复前和修复后的代码在相同的模拟器上运行并进行相同的操作,查看他们使用内存的情况,如下图所示

有内存泄漏的情况,占用内存约为43M

  修复了内存泄漏问题,占用内存为36M 在修复了内存泄漏问题后,内存使用下降了16.3%!!!
最后补充一个我遇到的例子
优化代码后,明显解决了上述问题
最后,在掌握了Android Monitor的使用方法后,相信能在android开发的路上助各位一臂之力。

Android studio内存泄露分析工具相关推荐

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

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

  2. Visual Studio内存泄露检测工具

    使用简介 在写程序的过程中,难免会遇到内存泄露的时候,这个时候如果手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是很耗时间和精力的.诚然,我们可以借助一些工具,而且我们还会惊奇地发现这 ...

  3. Visual studio内存泄露检查工具--BoundsChecker

    BoundsChecker是一个Run-Time错误检测工具,它主要定位程序在运行时期发生的各种错误. BoundsChecker能检测的错误包括: 1)指针操作和内存.资源泄露错误,比如:内存泄露: ...

  4. Android 内存泄露分析

    1 内存泄漏简介 内存泄漏是指内存空间使用完毕后无法被释放的现象.尽管Java有垃圾回收机制(GC),但是对于还保持着引用,逻辑上却已经不会再用到的对象,垃圾回收器不会回收它们. 内存泄漏带来的危害: ...

  5. Android C++ Native 内存泄露检查工具Raphael使用介绍

    Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...

  6. 关于Android 的内存泄露及分析

    博客园 首页 新随笔 联系 管理 订阅 随笔- 137  文章- 6  评论- 145  关于Android 的内存泄露及分析 一. Android的内存机制 Android的程序由Java语言编写, ...

  7. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

  8. linux 进程内存分析工具,Linux内存使用情况以及内存泄露分析之工具与方法

    1. 内存使用情况分析 1.1 系统总内存分析 通过cat /proc/meminfo,可用的物理内存=MemFree+Buffers+Cached. MemTotal:        5933132 ...

  9. JAVA内存泄露分析和解决方案及WINDOWS自带查看工具

    JAVA内存泄露分析和解决方案及WINDOWS自带查看工具 Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最 ...

最新文章

  1. ZooKeeper架构设计及其应用要点
  2. ⒉设置 Bash 选项[3-3]
  3. numpy.cov()和numpy.var()的用法
  4. drools6.5_使用Drools 6.0进行部署
  5. 学成在线--5.CMS页面管理开发(修改页面)
  6. jframe运行和预览大小不一样_在泉州楼市中12个热门置业板块中,购房竞争压力大小各不一样...
  7. JAVA基本数据类型所占字节数是多少?
  8. 计算机组成原理————P1 软硬件发展
  9. rand()与srand()函数用法详解
  10. 计算机运行卡英语怎么说,处理电脑卡顿(国外英文资料).doc
  11. JavaScript 修改地址栏指定参数
  12. 【论文笔记】Expanding holographic embeddings for knowledge completion
  13. [shell] sed 插入多行文本
  14. mysql停掉正在运行的存储过程
  15. 佛寺风飘飘,塔上幡摇摇
  16. Android单元测试的步骤
  17. 我画了近百张图来理解红黑树
  18. PAT甲级1005 Spell it Right 【20】【字符串操作】
  19. 黑群晖给局域网电脑发消息_笔记本黑群晖实现局域网网络唤醒
  20. python做股票系统_GitHub - Suking/stock: stock,股票系统。使用python进行开发。

热门文章

  1. 海归计算机专业简历怎么写,海归英文简历范文
  2. python清除所有变量_python清除变量
  3. mysql高级技术之mycat读写分离技术实践
  4. NO2:自动生成sql语句
  5. java将两个数组合并为一个数组并排序,人生转折!
  6. linux如何检测网络是否畅通,linux网络不通如何检查
  7. 华为实习生笔试考后感
  8. 战神4 幕后花絮 概念艺术_Java 9的幕后花絮–如何制作新功能
  9. 在此计算机上运行应用程序不可选,win10提示此应用无法在你的电脑上运行若要找到适用怎么解决...
  10. INT,INT32,_int64的范围