美文网首页程序员
Android内存优化 | LeakCanary/Profile

Android内存优化 | LeakCanary/Profile

作者: 凌川江雪 | 来源:发表于2020-08-16 03:23 被阅读0次

    模拟一个 非静态内部类耗时操作

    public class InnerClassActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_inner_class);
    
    
            /**
             * 内部类对象 对 外部类对象 有一个 隐式的!!!强引用!!!
             * 强引用 User u = new User(); 显式的强引用,强可及对象,GC不回收
             * 软引用、弱引用、虚引用
             *
             *  下面的 Thread 匿名内部类实例 引用着一个 InnerClassActivity 实例
             *
             *  对于一个线程,只有当它的任务(run())完全执行完了,
             *  系统才会把这个线程销毁回收,回收之后,
             *  这里的 Thread 匿名内部类实例 才不会 引用外部类实例
             *
             *  但是如果 Thread 的 run() 没有执行完,Activity 即使退出了,
             *  Thread还在执行,还引用着 Activity,会导致 Activity 无法被回收
             *  Activity 在 Android中,占用内存是比较大的!
             */
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //模拟耗时操作
                    SystemClock.sleep(100000);
    
                }
            }).start();
        }
    }
    


    LeakCanary实战

    参考文章

    • 项目引入依赖
    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 LeakApplication extends Application {
        @Override public void onCreate() {
        super.onCreate();
    
        ......
    
        if (LeakCanary.isInAnalyzerProcess(this)) {//1
          // This process is dedicated to LeakCanary for heap analysis.
          // You should not init your app in this process.
          return;
        }
        LeakCanary.install(this);
      }
    }
    

    如果当前的进程是用来给LeakCanary 进行堆分析的则return,
    否则会执行LeakCanary的install方法,
    如果检测到某个Activity 有内存泄露,
    LeakCanary 就会给出提示;
    并打出发生泄漏的地方;



    使用Profiler

    使用Profiler,
    选择一段陡增的曲线,
    选择恰当的排序方式
    也可以看到InnerClassActivity被各种点名:

    相关文章

      网友评论

        本文标题:Android内存优化 | LeakCanary/Profile

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