zoukankan      html  css  js  c++  java
  • Android内存泄漏排查利器LeakCanary

    开源地址:https://github.com/square/leakcanary

    在 build.gralde 里加上依赖, 然后sync 一下, 添加内容如下

    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类里面将 LeakCanary 初始化。。 比如叫MyApplication ,如果没有就创建一个,继承 android.app.Application。 别忘了在AndroidManifest.xml中加上,否则不起作用

    public class MyApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
    
            if (LeakCanary.isInAnalyzerProcess(this)) {
                // This process is dedicated to LeakCanary for heap analysis.
                // You should not init your app in this process.
                return;
            }
            LeakCanary.install(this);
    
            // 你的其他代码从下面开始
        }
    }

    官方已经有demo了,可以跑跑看。

    package com.github.pandafang.leakcanarytest;
    
    import android.app.Activity;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.SystemClock;
    import android.view.View;
    
    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
            View button = findViewById(R.id.async_task);
            button.setOnClickListener(new View.OnClickListener() {
                @Override public void onClick(View v) {
                    startAsyncTask();
                }
            });
        }
    
    
        void startAsyncTask() {
            // This async task is an anonymous class and therefore has a hidden reference to the outer
            // class MainActivity. If the activity gets destroyed before the task finishes (e.g. rotation),
            // the activity instance will leak.
            new AsyncTask<Void, Void, Void>() {
                @Override protected Void doInBackground(Void... params) {
                    // Do some slow work in background
                    SystemClock.sleep(20000);
                    return null;
                }
            }.execute();
        }
    }

    进入主界面按下按钮, 再按返回键退出主界面, 反复几次,LeakCanary  就能探测到内存泄漏了。注意要多操作几次,1次的话泄漏规模太小,可能不会探测到。LeakCanary  一旦探测到会弹出提示的。

    回到桌面,会看到一个LeakCanary 的图标,如果有多个app 用到就会有多个LeakCanary图标。

     点进去就会看到内存泄漏记录

    再点进去就可以看到调用栈了

  • 相关阅读:
    Struts2笔记——ONGL表达式语言
    Struts2笔记——自定义拦截器
    Struts2笔记——Action校验器
    Struts2笔记——文件上传
    Struts2笔记——与ServletAPI解耦
    Struts2笔记——通配符和动态方法调用
    Struts2笔记——类型转换
    Struts2笔记——result结果类型
    MongoDB相关资料
    公开数据集
  • 原文地址:https://www.cnblogs.com/lonkiss/p/6604760.html
Copyright © 2011-2022 走看看