内存泄漏检测利器--leakcanary实例试玩
2016-05-15 11:29
411 查看
以前,我们测试内存泄漏是这样的:
1.打开android studio的内存监控,重复进入退出模块然后看内存
2.利用mat的插件去比较分析
现在:
1.利用leakcanary工具直接注入,然后默默等待…
这个开源工具的地址:https://github.com/square/leakcanary
好了,接下来开始试玩了,leakcanary的使用非常简单,在build.gradle中添加依赖包
然后在你自己的application类当中的onCreate方法加入
嗯,没了,就是这样,深入的使用方法以后有空再研究吧,不过这样已经可以定位到问题了,下面是自己构造的泄漏的代码:
下面是构造一个大的activity,并注册在一个静态
声明的一个管理类,持续持有对象
好了,开始运行,每次点击按钮后返回,gc,多次操作的内存图如下:
太明显了…
最后是运行的界面图以及多次操作后的泄漏图
那么重点关注结果图,最后的红点表示的是Main2Activity实例泄漏的,而上面几个是跟踪过程,可以看到最后定位到的是arrayList这个容器有泄漏,然后就可以走查代码了
也就是定位到上面这行,也就能发现问题了,解决方法是这样的,非常通用,在onDestory反注册就完了:
然后在此运行:
ok,完美解决,leakcanary确实是神器 :) 目前已经在我们项目中使用了 效果棒棒的。
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确实是神器 :) 目前已经在我们项目中使用了 效果棒棒的。
相关文章推荐
- c语言内存泄露示例解析
- 解决js函数闭包内存泄露问题的办法
- IE下使用jQuery重置iframe地址时内存泄露问题解决办法
- Android App调试内存泄露之Cursor篇
- js内存泄露的几种情况详细探讨
- Javascript 闭包引起的IE内存泄露分析
- 深入解析PHP垃圾回收机制对内存泄露的处理
- PHP脚本内存泄露导致Apache频繁宕机解决方法
- 容易造成JavaScript内存泄露几个方面
- 关于js内存泄露的一个好例子
- 总结JavaScript在IE9之前版本中内存泄露问题
- Android垃圾回收机制解决内存泄露问题
- Android编程中避免内存泄露的方法总结
- C语言中的内存泄露 怎样避免与检测
- PHP CURL 内存泄露问题解决方法
- Java中典型的内存泄露问题和解决方法
- Android中Handler引起的内存泄露问题解决办法
- 浅谈Java编程中的内存泄露情况
- 理解Java中的内存泄露及解决方法示例
- Android中声名Handler变量的内存泄露问题