使用Handler容易产生的内存泄露以及介绍下Java的4种引用

转载请注明出处:王亟亟的大牛之路

最近时间都利用的不太好,都是到下午才开始学习或者做事,一上午都吹B或者XXX用掉了。。。不太好,这里督促下自己不要再懒惰,哈哈!!

再安利下我的整合库,方便大家找资源:https://github.com/ddwhan0123/Useful-Open-Source-Android

废话不多说,今天来讲下一个“经常”遇到的一个内存泄露的情况来引出想提的Java的4种引用方式

在举例子之前先将一些基础的知识,不然基础薄弱的同学还会不理解什么的。(当然,我会讲的很粗略,但是你一定能看懂)

通常Java分配内存有三种策略,分别为静态存储区

静态存储区: 平时那些static的变量啊,方法啊都在这里面,并且在程序整个运行期间都存在。

:我们执行的那些方法所产生的对象都在这里面,方法结束这些东西就会被释放掉。

:我们平时 new出来的那些对象都会在这里面。

那如何区分堆,栈呢?

局部变量的基本数据类型和引用存储于栈中,引用的对象实体存储于堆中。—— 因为它们属于方法中的变量,生命周期随方法而结束。

成员变量全部存储与堆中(包括基本数据类型,引用和引用的对象实体)—— 因为它们属于类,类对象终究是要被new出来使用的。

那接下来我们来看下例子

Handler 造成的内存泄漏

为什么会出现?

Handler 属于 TLS(Thread Local Storage) 变量, 生命周期和 Activity 是不一致的。所以很有可能我们的Activity的逻辑早就结束了,但是Handler持有Activity的引用导致Activity的资源无法回收。

可以看下这个简单的例子:

myHandler 将其 push 进了消息队列 MessageQueue 里。

当该 Activity 被 finish() 掉时,延迟执行任务的 Message 还会继续存在于主线程中,它持有该 Activity 的 Handler 引用,所以此时 finish() 掉的 Activity 就不会被回收了

从而造成内存泄漏(因 Handler 为非静态内部类,它会持有外部类的引用)。

那我们可以在Handler申明的时候加 static,让他存活期跟 Activity 的生命周期就无关了。

然后我又找到了一个更好的解决方法,就是通过弱引用的方式引入 Activity,避免直接将 Activity 作为 context 传进去。

这样如果Activity已经不在了,也就不做这些事了。

上面已经用到了弱饮用,那么和强引用又有什么区别呢?就是接下来要讲的。

java的引用有4种分别是

强引用(StrongReference)软引用(SoftReference)弱引用(WeakReference)虚引用(PhantomReference)

强引用(StrongReference)

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。

就是我们平时 new 的那些对象(这里不包括局部变量,别误解)

像这样

Apple a=new Apple();

如果是方法内的局部变量,在方法结束前你也不需要做把他设置为null的操作,让GC来消除他。显式地设置a为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象

像list之类的因为 你通常是  List list =new ArrayList<>();出来了的,所以如果不用了,建议手动clear()下,而不是以为list.get(x)为null了他就会被回收。

软引用(SoftReference)

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。

Stringv=newString("wjj");// 强引用

SoftReferencesoftRef=newSoftReference(v);// 软引用

那么在内存吃紧的时候softRef就会被回收。

使用场景:

我有一个Activity,他有很多图片,图片都在map里缓存,我切出去再back回来如果不用缓存,每次IO操作去读sd卡,但是有了缓存我就可以迅速的加载,提升用户的体验。如果内存吃紧被回收了,那也只能去重新加载了(强烈抗议刻意不让系统回收这些缓存数据)

弱引用(WeakReference)

在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。

和软引用的区别就是,一个内存不足才回收,一个看到就回收!

用法跟上面几乎一样,就不贴代码了。

应用推荐:  如果这个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象。

虚引用(PhantomReference)

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。

大致的概念如下

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • 内存管理的目的就是让我们在开发中怎么有效的避免我们的应用出现内存泄漏的问题。内存泄漏大家都不陌生了,简单粗俗的讲,...
    宇宙只有巴掌大阅读 2,326评论 0 12
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,275评论 18 399
  • 其实来说 真的不能再这么情绪化了 没有那么多感情去思量
    第三人称dym阅读 103评论 0 0
  • 一阵风,一颗种子,一片蒲公英。随风飘洒的灵魂散发着无边际的轻盈与欢乐。诉说着青春的故事。那时我们正当年少,懵懂无知...
    上攻素文阅读 161评论 0 0