Android内存泄漏分析

转载 2016年08月31日 16:31:50

Android内存泄漏分析

本文转载自:http://www.apkbus.com/home.php?mod=space&uid=705730&do=blog&id=61605

Android中的内存分为:

  1. native进程:采用C/C++实现,不包含dalvik实例的进程。
  2. java进程:Android中运行于dalvik虚拟机之上的进程。每一个java进程都是存在于一个native进程中。

内存空间是一定的,所以在对象无用时就要回收一些对象来留出空间。当Java Garbage Collection开始运行时,它会从他了解还存活的对象作为内存遍历的根节点(GC Root),遍历heap内存空间,没有直接或间接引用到GC Root的对象便会被回收。

而Android内存泄漏便是指进程中的对象,虽然没有使用价值了,但它仍然有直接或间接的引用到GC Root,那么该对象便不会被GC回收,导致内存持续被占用,使可用内存变小。

常见的内存泄漏

  1. 查询数据库没有关闭Cursor。
  2. 使用BaseAdapter作为适配器时没有复用convertView。可以参考ListView与BaseAdapter优化.
  3. bitmap没有回收,可以参考Bitmap相关:管理Bitmap内存.
  4. 注册对象后没有反注册,比如Broadcast Receiver等。
  5. handler问题,如果handler是非静态的,会导致Activity或者Service不被回收,所以应当注册为静态内部类,同时在onDestroy时停止线程:mThread.getLooper().quit();
  6. Activity被静态引用,特别是缓存bitmap时,解决方法可以考虑使用Application的context代替Activity的context。
  7. View在callback中被引用,可能回调还没有结束,但是view处于引用状态,无法回收

    public void leak(final View view) {
        api.callback(new callBack() {
            onCallBack() {
                ...
            }
        )
    }
    
  8. WebView的泄露问题:在魅族上面发现webView打开再关闭就会内存泄露..目前使用的解决方法是在webview外面嵌套一层layout作为container.在Activity的onDestroy中调用container.removeAllViews()方法.
  9. Dialog导致Window泄露,如果需要在dialog依附的Activity销毁前没有调用dialog.dismiss().会导致Activity泄露

检测内存泄露的方法

  1. Android Studio 自带的 Memory Monitor,手动触发GC可以看得比较直观,但是dump出来的文件需要处理才能用MAT打开,利用 sdk/platforms-tool/ 下的 hprof-conv 文件,命令为:

    /hprof-conv source output
    
  2. MAT这篇文章分析得比较透彻

  3. Leakcanary,检测一些容易忽略的内存泄露很好用.
  4. adb shell dumpsys meminfo [包名]可以看到内存使用情况.

一些值得注意的地方

  1. 理论上来说,当你退出一个 Activity 后,强制GC一次,内存值应该回到跟进入 Activity 差不多的状态,否则就有可能是内存泄露了.但是有可能是图片加载库中对新 Activity 中加载的图片做了内存缓存,然而这部分内存 GC 可能暂时不会回收.

    比如在应用中我使用了 Fresco 去加载本地图库中的图片, Fresco 对这些图片做了内存缓存,然而这部分的图片其实是不需要在内存中缓存的.

推荐:

Android内存泄漏案例分析

  • 2015年08月31日 09:47
  • 949KB
  • 下载

Android 内存泄漏分析

  • 2017年04月04日 19:53
  • 232KB
  • 下载

android 中如何分析内存泄漏

前提条件: 1,电脑安装了java 运行环境   2,手机端开启了 USB 调试开关  3,获取 root 权限 基本步骤: 1,使用eclipse 自带的 DDMS 工具分析各线程的内存使用情况,如...

有关android 內存泄漏的问题

  • 2012年11月24日 14:12
  • 80KB
  • 下载

Android 内存泄漏工具使用分析

最近的一次事件让我对 Android 开发中内存泄漏重视起来,平时只忙着开发新的功能,往往会忽略掉内存,cpu 等方面的使用情况,然而遇到 内存泄露或者ANR 问题就要彻底解决,由于Android设备...
  • cpfdpzc
  • cpfdpzc
  • 2016年11月25日 15:00
  • 147

Android内存泄漏分析及调试

尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 =========================...

android 内存泄漏 摘抄

  • 2012年07月15日 22:54
  • 264KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android内存泄漏分析
举报原因:
原因补充:

(最多只允许输入30个字)