Android LeakCanary 检测内存泄露

内存泄漏:

  指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光

内存泄露危害:

1.内存泄露最终会导致内存溢出(OOM)

2.导致程序卡顿,应用程序莫名退出

内存泄露检测工具

  • Memory Monitor(不能精准的定位问题)
  • MAT工具 (操作复杂,学习成本高)
  • 还有许多就不一一列举了

Android中常见的内存泄露(欢迎指证与添加)

大图片也能造成OOM

hangdler造成的内存泄露解决办法

当Activity退出时消息队列中还有未处理的消息或者正在处理的消息
而消息队列中的Messager持有handler实例的引用, handler又持有activity的引用,所以导致Activity的内存资源无法及时回收,引发内存泄露

解决办法:
1.使用弱引用
2.使用静态handler内部类
3.在onDestory()方法中调用removeCallbacksAndMessagers(null);

单例造成的内存泄露解决办法

原因:单例的静态特性 使得单例的生命周期和应用的生命周期一样长,这就说明如果一个对象已经不需要使用了,而单例对象还持有该对象的引用,那么这个对象不能正常回收,就会导致内存泄露
#
解决办法:如果此时传入的是 Activity 的 Context,当这个 Context 所对应的 Activity 退出时,由于该 Context 的引用被单例对象所持有,其生命周期等于整个应用程序的生命周期,所以当前 Activity 退出时它的内存并不会被回收,这就造成泄漏了
所以如果此时传入的是 Application 的 Context,因为 Application 的生命周期就是整个应用的生命周期,所以这没有任何问题。

非静态内部类创建实例造成的内存泄露

将该内部类设为静态内部类或将该内部类抽取出来封装成一个单例,如果需要使用Context,请使用ApplicationContext

线程造成的内存泄露

异步任务和Runnable都是一个匿名内部类,因此它们对当前Activity都有一个隐式引用。如果Activity在销毁之前,任务还未完成,
那么将导致Activity的内存资源无法回收,造成内存泄漏
#
解决办法
正确的做法还是使用静态内部类的方式

资源没有关闭造成的内存泄露

如数据库 流

LeakCanary介绍

这个才是今天的正题

LeakCanary使用示例

  参考LeakCanary官方示例 https://github.com/square/leakcanary
首先我们需要在应用的 build.gradle 中,添加依赖:


debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2

LeakCanary依赖添加后,我们添加一个Application类

1.创建个MyApplication类

 
public class MyApplication extends Application {
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
}

2.在AndroidManifest.xml文件中去配置这个application

  

 android:name=".MyApplication"

3.LeakCanary的配置就已经完成了,

然后运行应用程序除了会安装自己的App外还会安装leaks这个东西

https://github.com/square/leakcanary/raw/master/assets/icon_512.png

4.完(万)事具备,只欠东方 下面我就举个内存泄露的例子

 
private void initView() {
Button tv = (Button) findViewById(R.id.tv);
tv.setText("dsafsdfadsfdsafsa");
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AsyncTaskTest();
finish();
}
}
);
}
public void AsyncTaskTest() {
new AsyncTask

5.点击按钮 稍等片刻(可能时间稍微有点长),就会出现下面这个信息了

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值