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 中,添加依赖:
<pre><code>
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2
</code></pre>

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

1.创建个MyApplication类
<pre><code>
public class MyApplication extends Application {
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = LeakCanary.install(this);
}
}
</pre></code>

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

 android:name=".MyApplication"

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

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

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

4.完(万)事具备,只欠东方 下面我就举个内存泄露的例子
<pre><code>
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<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
SystemClock.sleep(20000000);
return null;
}
}.execute();
}
</pre></code>

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

这里写图片描述
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容

  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,360评论 0 12
  • 前言 对于内存泄漏,我想大家在开发中肯定都遇到过,只不过内存泄漏对我们来说并不是可见的,因为它是在堆中活动,而要想...
    EsonJack阅读 867评论 1 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,488评论 25 707
  • 我们全家都爱吃肉夹馍 可是对于外面的肉肉有点不放心 还是自己亲自动手吧 亲自和面 烙饼 亲自煮肉 做成了家人都爱吃...
    苏小柚阅读 300评论 0 1
  • 在现实的生活当中,你可能对当下的事情,很难做到百分之百的判断。但是对已经发生的事情,你的总结和完善,那才是重要的。
    泽阳9阅读 138评论 0 1