您的位置:首页 > 其它

内存泄漏检测利器--leakcanary实例试玩

2016-05-15 11:29 411 查看
以前,我们测试内存泄漏是这样的:

1.打开android studio的内存监控,重复进入退出模块然后看内存

2.利用mat的插件去比较分析

现在:

1.利用leakcanary工具直接注入,然后默默等待…

这个开源工具的地址:https://github.com/square/leakcanary

好了,接下来开始试玩了,leakcanary的使用非常简单,在build.gradle中添加依赖包

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'


然后在你自己的application类当中的onCreate方法加入

public class MyApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}


嗯,没了,就是这样,深入的使用方法以后有空再研究吧,不过这样已经可以定位到问题了,下面是自己构造的泄漏的代码:

下面是构造一个大的activity,并注册在一个静态

package com.cloudhuan.memorytest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class Main2Activity extends AppCompatActivity {

List<Object> l;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
l = new ArrayList<>();
for(int i = 0;i<10000;i++){
l.add(new Object());
}
Log.v("ch","------------>"+l.size());
MyActivityManager.registActivity(this);
}
}


声明的一个管理类,持续持有对象

package com.cloudhuan.memorytest;

import android.app.Activity;

import java.util.ArrayList;

/**
* Created by cloudhuan on 2016/5/15.
*/
public class MyActivityManager {

static ArrayList arrayList = new ArrayList();

public static void registActivity(Activity activity){
arrayList.add(activity);
}

public static void unregistActivity(Activity activity)  {
arrayList.remove(activity);
}
}


好了,开始运行,每次点击按钮后返回,gc,多次操作的内存图如下:



太明显了…

最后是运行的界面图以及多次操作后的泄漏图





那么重点关注结果图,最后的红点表示的是Main2Activity实例泄漏的,而上面几个是跟踪过程,可以看到最后定位到的是arrayList这个容器有泄漏,然后就可以走查代码了

static ArrayList arrayList = new ArrayList();


也就是定位到上面这行,也就能发现问题了,解决方法是这样的,非常通用,在onDestory反注册就完了:

@Override
protected void onDestroy() {
super.onDestroy();
MyActivityManager.unregistActivity(this);
}


然后在此运行:



ok,完美解决,leakcanary确实是神器 :) 目前已经在我们项目中使用了 效果棒棒的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存泄露