自从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的对象没有被回收掉。

举个栗子

    private static Leak mLeak;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);mLeak = new Leak();}class Leak {}

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

再举一个最常犯的栗子

public class Singleton {private static Singleton instance;private Context mContext;private Singleton(Context context){this.mContext = context;}public static Singleton getInstance(Context context){if (instance == null){synchronized (Singleton.class){if (instance == null){instance = new Singleton(context);}}}return instance;}
}

如果我们在在调用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的单例对象,直接定位到该单例中的代码,发现代码中出现了

public static VideoTagHelper getInstance(Context context) {if (tagHelper == null) {tagHelper = new VideoTagHelper();}tagHelper.context = context;return tagHelper;}

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

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

修复了内存泄漏问题,占用内存为36M
在修复了内存泄漏问题后,内存使用下降了16.3%!!!
掌握了Android Monitor的使用方法后,妈妈再也不担心我写的App会出现内存泄漏啦!!!

android studio 解决内存泄漏相关推荐

  1. 基于Android Studio的内存泄漏检测与解决全攻略

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

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

    本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...

  3. 使用Android Studio 查看内存泄漏

    用新版的AS 的profiler 查看内存泄漏 记录一下使用Android Studio 的profiler 查看内存泄漏的过程.新版的AS 的profiler 功`能强大.我们可以很方便的查看到一个 ...

  4. Android 性能优化 - 彻底解决内存泄漏

    起源 有趣的灵魂千奇百怪,内存泄漏的也是各式各样 我在15年写过一遍 文章 < android中常见的内存泄漏和解决办法>http://blog.csdn.net/wanghao20090 ...

  5. Android 如何有效的解决内存泄漏的问题

    前言:最近在研究Handler的知识,其中涉及到一个问题,如何避免Handler带来的内存溢出问题.在网上找了很多资料,有很多都是互相抄的,没有实际的作用. 本文的内存泄漏检测工具是:LeakCana ...

  6. Android Others部分内存泄漏 OOM分析

    本周公司项目解决内存泄漏,使用Android studio profiler工具进行分析. 在人工monkey测试点击管理页面各项菜单后,工具内存查看页面看到内存有增长不是释放的情况.但是dump后未 ...

  7. 关于Android应用程序内存泄漏 你需要知道的一切

    关于Android应用程序内存泄漏 你需要知道的一切 原文:https://blog.aritraroy.in/everything-you-need-to-know-about-memory-lea ...

  8. Android中的内存泄漏

    ** Android中的内存泄漏 ** Android中的内存泄漏: 概念:程序在申请内存后,当该内存不需再使用但却无法被释放 & 归还给程序的现象,对应用程序的影响,容易使得应用程序发生内存 ...

  9. Android Studio 解决The SDK platform-tools is too old问题

    今天,简单讲讲android studio 如何解决  The SDK platform-tools is too old的问题. 最近,使用android studio使用同事创建的项目时,发现 ...

最新文章

  1. 计算机组成原理学习1习题1
  2. .Net版行号消除器
  3. Java【前端动态添加一条记】【后端使用JDK1.8实现map对象根据key的部分值进行分组】(并将map对象封装成指定entity对象)
  4. mysql多个on_在多个查询中插入多行的MySQL ON DUPLICATE KEY UPDATE
  5. (转)Android ViewGroup的onInterceptTouchEvent()事件分析
  6. 关于epoll,select,poll的理解
  7. Flow monitoring in Software-Defined Networks
  8. Dailymotion 视频下载神器,喜欢太阳的后裔的人有福了!
  9. UserDetailsService详解
  10. logging 模块 与 logging 固定模块
  11. C11 标准下的 C 语言编程
  12. html中加音乐 全部过程,HTML中添加背景音乐
  13. mysql ndb存储引擎_ndb 存储引擎
  14. 一文了解 DoH(DNS-over-HTTPS)和DoT(DNS-over-TLS)
  15. 计算机无法访问苹果相册,iPhone与电脑连接后找不到照片怎么办?掌握这三个技巧,烦恼问题轻松解决!...
  16. 渗透学习日记day5
  17. 苹果消息是先推送到服务器,iPhone消息推送机制实现与探讨
  18. android 获取屏幕旋转方向,android获取手机屏幕尺寸和旋转方向
  19. StoneDB 团队成员与 MySQL 之父 Monty 会面,共话未来数据库形态
  20. 12v电源正负极区分_直流12v电源线圆形插头正负极怎么认

热门文章

  1. 什么是多模态深度学习?有哪些应用场景?
  2. H3C 路由器内网用户通过域名访问内网服务器的配置方法
  3. 店铺排名问题,如何解决?
  4. 室内也能用 那些适合在跑步机上使用的可穿戴设备
  5. 读书笔记 - 《秦殇》
  6. linux 移动剪切命令,Linux移动剪切文件和目录命令-Linux重命名文件和目录命令-Linux mv命令详解-嗨客网...
  7. linux 移动剪切命令,Linux切换/增加/查看/寻找/移动/拷贝/删除目录命令实例讲解...
  8. android动态设置文本居中显示图片,android按钮图片和文本居中的代码-你躺枪了吗...
  9. 看电影《爱情呼叫转移》
  10. 一文读懂vSAN的Raid5和Raid6