Android内存泄漏分析及MAT工具使用

作者: 森林苍穹 | 来源:发表于2017-07-10 11:35 被阅读0次

1.内存泄漏是什么

  • 一句话概括:就是GC垃圾回收机制漏掉的垃圾对象,无法回收
  • 内存泄漏过多就会造成内存溢出

2.什么是垃圾回收机制?

就是当对象不具备任何引用的时候,可被回收

3.GC ROOT Tracing 算法

GC Root Tracing
  • 被GC Root 引用的对象不可被回收
  • 没有被GC Root Obj所持有的对象可以被回收

4.可以作为GC Root引用的点是(不被回收):

  • java stack中引用的对象
  • 方法区中静态引用指向的对象
  • 方法去中常量引用指向的对象
  • Native方法中jni引用的对象
  • Thread—活着的线程

5.常见的内存泄漏案例:

参考QQ空间Android内存泄漏分析心得

  • 1:单例造成的内存泄漏

    • 解决方案
      • 将该属性的引用方式改为弱引用;
      • 如果传入Context,使用ApplicationContext;
  • 2: InnerClass匿名内部类

    • 在Java中,非静态内部类 和 匿名类 都会潜在的引用它们所属的外部类,但是,静态内部类却不会。如果这个非静态内部类实例做了一些耗时的操作,就会造成外围对象不会被回收,从而导致内存泄漏。
    • 解决方案
      • 将内部类变成静态内部类;
      • 如果有强引用Activity中的属性,则将该属性的引用方式改为弱引用;
      • 在业务允许的情况下,当Activity执行onDestory时,结束这些耗时任务;
  • 3:Activity Context 的不正确使用

    • 在Android应用程序中通常可以使用两种Context对象:Activity和Application。当类或方法需要Context对象的时候常见的做法是使用第一个作为Context参数。这样就意味着View对象对整个Activity保持引用,因此也就保持对Activty的所有的引用。
    • 解决方案
      • 使用ApplicationContext代替ActivityContext,因为ApplicationContext会随着应用程序的存在而存在,而不依赖于activity的生命周期;
      • 对Context的引用不要超过它本身的生命周期,慎重的对Context使用“static”关键字。Context里如果有线程,一定要在onDestroy()里及时停掉。
  • 4:Handler引起的内存泄漏

    • 当Handler中有延迟的的任务或是等待执行的任务队列过长,由于消息持有对Handler的引用,而Handler又持有对其外部类的潜在引用,这条引用关系会一直保持到消息得到处理,而导致了Activity无法被垃圾回收器回收,而导致了内存泄露。
    • 解决方案
      • 可以把Handler类放在单独的类文件中,或者使用静态内部类便可以避免泄露;
      • 如果想在Handler内部去调用所在的Activity,那么可以在handler内部使用弱引用的方式去指向所在Activity.使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。
  • 5:注册监听器的泄漏

    • 解决方案
      • 使用ApplicationContext代替ActivityContext;
      • 在Activity执行onDestory时,调用反注册;
  • 6:Cursor,Stream没有close,View没有recyle

  • 7:集合中对象没清理造成的内存泄漏

    • 在Activity退出之前,将集合里的东西clear,然后置为null,再退出程序。
  • 8: WebView造成的泄露

    • 当我们不要使用WebView对象时,应该调用它的destory()函数来销毁它,并释放其占用的内存,否则其占用的内存长期也不能被回收,从而造成内存泄露。
  • 9:构造Adapter时,没有使用缓存的ConvertView

6.使用AndroidStudio进行内存分析

步骤如下:

图1:


图1

图2:


图1

第二步:打开MAT工具,可以单独下载这个插件下载

图2

第三步:导入两个hprof文件,根据下图的步骤进行比较分析


图3

第四步:按照下图步骤选择


图4

最后:找到未释放的引用


图5

参考:
QQ空间Android内存泄漏分析心得

相关文章

网友评论

    本文标题:Android内存泄漏分析及MAT工具使用

    本文链接:https://www.haomeiwen.com/subject/wkuyhxtx.html