Android性能优化-内存泄漏(下)

作者: 黄俊彬 | 来源:发表于2017-03-22 10:23 被阅读833次

    如何进行内存泄漏的分析

    使用Android Studio Monitors

    AndroidMonitors是Android Studio自带的功能,我们可以通过里面的Memory模块来进行内存泄漏的分析,平时开发我们也可以通过该模块来观察内存的抖动情况。

    这里我们首先知道,标注1是进行GC的操作,标注2是进行Dump操作,也就是可以生成我们瞬时的堆内存快照,我们主要也是通过分析堆内存的快照来进行内存泄漏分析。
    一般我们先进行几次gc操作,待内存平稳后,执行dump操作。会生成一个phrof的内存快照

    使用MAT

    MAT是一款功能更强大的内存泄漏分析工具,在实际的内存分析中,我们可以结合Monitors进行内存泄漏分析。

    下载地址http://www.eclipse.org/mat/

    导入快照后,我们可以通过Histogram查看内存快照


    我们可以看到,这个时候引用还是非常的,我们需要过滤一些无用的软引用之类的。通过右键-megre shortest path to GC roots-exclude all phantom/sofe/weak etc.refrences进行过滤,这个时候基本就能查出我们自己写的代码的引用

    使用leakcanary

    Square开源了一个内存泄露自动探测神器——LeakCanary,它是一个Android和Java的内存泄露检测库,可以大幅度减少了开发中遇到的OOM问题。

    github https://github.com/square/leakcanary

    通过官方的文档介绍,我们可以轻松在项目集成

    加入依赖:

     dependencies {
       debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
       releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
       testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
     }
    

    Application 配置:

    public class ExampleApplication extends Application {
    
     ......
     //在自己的Application中添加如下代码
    public static RefWatcher getRefWatcher(Context context) {
       ExampleApplication application = (ExampleApplication) context
               .getApplicationContext();
       return application.refWatcher;
    }
    
     //在自己的Application中添加如下代码
    private RefWatcher refWatcher;
    
    @Override
    public void onCreate() {
       super.onCreate();
       ......
           //在自己的Application中添加如下代码
       refWatcher = LeakCanary.install(this);
       ......
    }
    
    .....
    }
    
    

    使用 RefWatcher 监控那些本该被回收的对象:

    public abstract class BaseFragment extends Fragment {
    
      @Override public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
        refWatcher.watch(this);
      }
    }
    
    

    最后如果有内存泄漏,会接收到相应的推送。

    这样我们就能在编码的阶段,尽量的避免出现内存泄漏的情况。

    如何对自己的项目进行内存泄漏分析

    上面说了这么多,怎么来对我们自己的项目进行内存泄漏的分析呢?

    一般我们都是在不知道项目中那里有存在内存泄漏的情况下,怎么来查找出那个地方出现了内存泄漏?

    这里我们主要检查Activity及Fragment的内存泄漏情况。

    使用Memory Usage查看Activity及Fragment的内存泄漏情况,首先先运行自己项目到MainActivity,观察 Menory Usage。

    这个时候我们可以看到引用的的可怀疑对象,接着我们就进入源码分析。


    果然这里有一个单例持有了MainActivity的使用。

    分析内存泄漏是一个体力活,我们大概在项目中主要要记住。

    1. 使用leakcanary 在编码阶段进行检测

    2. 结合内存抖动及Memory Usage 检查Activity及Fragment的的泄漏情况

    3. 使用Monitor及Mat进行引用持有分析找出怀疑的对象

    4. 分析源代码,找到元凶

    相关文章

      网友评论

      本文标题:Android性能优化-内存泄漏(下)

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