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

  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 Studio检测内存泄露和性能

    韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha 313134555@qq.com 首先需要明白一个概念, 内存泄露就是指,本应该回收的内存,还驻留在内存中.  一般情况下,高密度 ...

  2. Android Studio 模拟器卡慢、占内存解决方法

    Android Studio 模拟器卡慢.占内存解决方法 Android Studio 模拟器卡慢.占内存解决方法 在使用Android virtual device来进行调试运行时会比较慢,性能也不 ...

  3. 32位Win 7 系统安装Android Studio遇到的错误以及解决方法

    32位Win 7 系统安装Android Studio遇到的错误以及解决方法 前言:自从Google推出了Android Studio,在结束完原本用Eclipse开发的项目后,便也开始跟随潮流使用起 ...

  4. android studio socket 失败,Android应用开发Android Studio建立Socket连接失败解决方法

    本文将带你了解Android应用开发Android Studio建立Socket连接失败解决方法,希望本文对大家学Android有所帮助. < Android Studio建立Socket连接失 ...

  5. android studio的 gradle 依赖同步错误解决方法

    android studio的 gradle 依赖同步错误解决方法 参考文章: (1)android studio的 gradle 依赖同步错误解决方法 (2)https://www.cnblogs. ...

  6. android studio日志不打印,Mac 下 Android Studio 不打印日志的解决办法

    Mac 下 Android Studio 不打印日志的解决办法 Mac 下 Android Studio 不打印日志的解决办法 前言: 在 Mac 下使用 Android Studio 时常会遇到 A ...

  7. android studio 中文乱码,字体优化解决之道

    打开Android Studio我们会发现 中文变成了口口口口口... android studio 中文乱码,字体优化解决之道 (转载请标注:源自; Phodal's Blog ) 解决方法如下: ...

  8. [异常解决] android studio检测不到手机的解决办法——ADB驱动自己安装

    用android studio搭建安卓开发环境比eclipse简单的多,仅仅下载一个1个G左右的安装包安装即可. 安装好之后随便建一个hello world工程,想用实体手机调试要点: 选择USB设备 ...

  9. Android Studio 使用起来很卡,内存CPU爆了

    发现更新Android Studio 后运行程序的时候 360检测球显示CPU百分之九十以上,内存严重不足.直接卡了三分钟左右,程序才运行成功,后来发现并不是更新问题,新建一个HelloWorld代码 ...

最新文章

  1. 和产品争论MySQL底层如何实现order by的,惨败!
  2. SAP MM已经转成PO的采购申请Item依旧可以被删除?
  3. [书目20130216]深入浅出WPF
  4. php查询sql2008数据库操作系统,使用 PHP 进行查询 - Azure SQL Database SQL Managed Instance | Microsoft Docs...
  5. springMVC 控制层添加异步线程
  6. php大数除法保留精度问题
  7. yum安装Apache Web Server后各个文件存放位置
  8. Perl Fork的问题
  9. 一张图看懂OSPF邻接关系建立及报文类型
  10. 突破asp过滤系统入侵网站
  11. 用户账户、共享和NTFS权限
  12. Multisim软件使用详细入门教程(图文全解)
  13. junit5 入门系列教程-05-junit5 断言(assert)
  14. cpp读取分数并进行求和化简
  15. java广告投放系统_1.互联网广告投放管理系统 V1.0 源代码.doc
  16. 显卡的性能看哪些参数?
  17. 云服务器deeplearning_吴恩达deeplearning.ai将于11月6日开放第四课,主讲卷积神经网络...
  18. jvm原理解析——不疯魔不成活
  19. 用libpcap分析CAIDA的网络流量文件的猝发性
  20. vlan聚合---supper vlan

热门文章

  1. C++之阻塞和非阻塞区别
  2. golang环境 centos 7
  3. eclipse查看代码git历史_Eclipse中GIT历史版本比较和回退
  4. 2019年伯克利大学 CS294-112《深度强化学习》第2讲:监督学习和模仿学习(笔记)
  5. xp_sendmail的正确配置与使用
  6. 似水流年的伤感QQ日志_爱那么短,遗忘那么长
  7. vue uniapp 实现走马灯 ,文字横向滚动
  8. 用python画熊猫_当熊猫不够用熊猫
  9. Java用户管理系统【完整版】
  10. 三百以内什么蓝牙耳机比较好?300以内最好的蓝牙耳机推荐