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图标。

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

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

  • 相关阅读:
    原创的java数据访问框架
    在ASP.NET中使用Session常见问题集锦
    Infragistics中WebGrid的MultiColumn Headers设计
    常用asp.net代码
    如何实现函数IF的嵌套超过七层?
    Microsoft® Visual Studio® 2005 Team Suite Service Pack 1
    ASP.NET中常用的文件上传下载方法
    ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站
    office2007TW
    http://www.ydowns.com/download/53279.rar
  • 原文地址:https://www.cnblogs.com/lonkiss/p/6604760.html
Copyright © 2011-2022 走看看