前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android内存优化 | LeakCanary/Profiler & 非静态内部类耗时操作 实战分析

Android内存优化 | LeakCanary/Profiler & 非静态内部类耗时操作 实战分析

作者头像
凌川江雪
发布2020-08-17 16:04:34
6420
发布2020-08-17 16:04:34
举报
文章被收录于专栏:李蔚蓬的专栏李蔚蓬的专栏

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

代码语言:javascript
复制
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实战

  • 项目引入依赖
代码语言:javascript
复制
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 中:
代码语言:javascript
复制
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被各种点名:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模拟一个 非静态内部类耗时操作
  • LeakCanary实战
  • 使用Profiler
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档