Android 内存泄漏的八种情况与防范

内存泄漏(Memory Leak)

当一个对象已经不需要使用了,本该被回收时,

而有另外一个正在使用的对象持有它的引用,从而导致了对象不能被GC回收。

内存溢出(OOM

- Out Of Memory)

当应用程序的堆(heap)资源超过了 Dalvik

虚拟机分配的内存就会内存溢出。

注:内存泄漏与内存溢出的区别与联系!

内存泄漏带来的影响:

1.

影响内存分配,造成应用程序执行效率降低;

2.

可分配的内存越少,更加容易出现内存溢出;

--------------------------------------------------------------------------------

成员变量全部存储在堆中(包括基本数据类型,引用及引用的对象实体),

因为他们属于类,类对象最终还是要被new出来的。

局部变量的基本数据类型和引用存在栈中,应用的对象实体存储在堆中。

因为它们属于方法当中的变量,生命周期会随着方法一起结束。

1.

类型

StrongReference 强引用

回收时机

任何时候GC是不能回收他的,哪怕内存不足时,

系统会直接抛出异常OutOfMemoryError,也不会去回收

生命周期

进程终止

类型

SoftReference 软引用

回收时机

当内存足够时不会回收这种引用类型的对象,只有当内存不够用时才会回收

生命周期

内存不足,进行GC的时候

2.

类型

WeakReference 弱引用

回收时机

GC一运行就会把它回收了

生命周期

GC后终止

3.

类型

PhantomReference 虚引用

回收时机

如果一个对象与虚引用关联,则跟没有引用与之关联一样,

在任何时候都可能被垃圾回收器回收

生命周期

任何时候都有可能

开发时,为了防止内存溢出,处理一些比较占用内存并且生命周期长的对象时,

可以尽量使用软引用和弱引用。

--------------------------------------------------------------------------------

1.资源未关闭造成的内存泄漏:

对于使用了

BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap

等资源的使用,

应该在Activity销毁时及时关闭或者注销,

否则这些资源将不会被回收,造成内存泄漏。

解决方案:

在Activity销毁时及时关闭或者注销。

2.单例造成的内存泄漏:

当调用getInstance时,如果传入的context 是 Activity 的 context 。

只要这个单例没有被释放,那么这个 Activity也不会被释放一直到进程退出才会释放。

解决方案:

能使用 Application 的 Context就不要使用 Activity 的 Content,

Application的生命周期伴随着整个进程的周期。

3.使用了静态的

Activity 和 View :

解决方案:

应该及时将无用的静态对象/变量置为null,

而且一般不建议将 View 及 Activity设置为静态。

4.线程造成的内存泄漏:

异步任务和 Runnable都是一个匿名内部类,

因此它们对当前 Activity都有一个隐式引用。

如果 Activity在销毁之前,任务还未完成,

那么将导致 Activity的内存资源无法回收,造成内存泄漏。

解决方案:

使用静态内部类,避免了 Activity的内存资源泄漏,

当然在 Activity销毁时候也应该取消相应的任务,

避免任务在后台执行浪费资源。

5.注册了系统的服务,但 onDestory 未注销:

解决方案:

不需要用的时候记得移除监听。

6.不需要用的监听未移除会发生内存泄露:

解决方案:

监听执行完回收对象,不用考虑内存泄漏

7.非静态内部类创建静态实例造成的内存泄漏:

解决方案:

将非静态内部类修改为静态内部类。

静态内部类不会隐式持有外部类。

8.Handler

造成的内存泄漏:

mHandler 是 Handler的非静态匿名内部类的实例,所以它持有外部类 Activity 的引用,

消息队列是在一个 Looper线程中不断轮询处理消息,

那么当这个 Activity退出时消息队列中还有未处理的消息或者正在处理消息,

而消息队列中的 Message 持有mHandler 实例的引用,

mHandler 又持有 Activity的引用,

所以导致该 Activity的内存资源无法及时回收,引发内存泄漏。

解决方案:

创建一个静态 Handler 内部类,然后对Handler 持有的对象使用弱引用,

这样在回收时也可以回收 Handler持有的对象,这样虽然避免了 Activity 泄漏,

不过 Looper线程的消息队列中还是可能会有待处理的消息,

所以在 Activity 的 onDestroy时或者 onStop 时应该移除消息队列中的消息。

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

推荐阅读更多精彩内容

  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    DreamFish阅读 789评论 0 5
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,359评论 0 12
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    _痞子阅读 1,619评论 0 8
  • Android 内存泄漏总结 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏...
    apkcore阅读 1,216评论 2 7
  • 被文同时发布在CSDN上,欢迎查看。 APP内存的使用,是评价一款应用性能高低的一个重要指标。虽然现在智能手机的内...
    大圣代阅读 4,802评论 2 54