內(nèi)存泄漏原理探討

 Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };
handler.sendEmptyMessage(0);

當(dāng)你如此定義一個(gè)handler的時(shí)候矗愧,系統(tǒng)會(huì)提示你,可以會(huì)產(chǎn)生內(nèi)存泄漏郑原,那么為什么會(huì)產(chǎn)品內(nèi)存泄漏唉韭,如何避免。
先來分析一下為什么會(huì)產(chǎn)品內(nèi)存泄漏犯犁,首先上面的Handler是一個(gè)內(nèi)部類属愤,內(nèi)部類會(huì)持有外部類的引用,所以Handler持有了Activity的引用酸役,sendEmptyMessage的時(shí)候會(huì)創(chuàng)建一個(gè)Message
對(duì)象住诸,而Message持有Handler的引用,然后Message會(huì)被添加進(jìn)入MessageQueue涣澡,Looper執(zhí)行l(wèi)oop之后會(huì)循環(huán)從MessageQueue取出Message消費(fèi)掉贱呐,MainLooper是在AvtivityThread里面初始化,且不能停止入桂。所以一個(gè)引用連就分析出來了奄薇。
Activity-Handler-Message-MessageQueue-Looper。當(dāng)Activity創(chuàng)建了Handler且Activity結(jié)束的時(shí)候抗愁,Message還在MessageQueue里面的話馁蒂,就會(huì)內(nèi)存泄漏。

什么是內(nèi)存泄漏驹愚,我的理解就是远搪,當(dāng)分配了內(nèi)存空間,卻沒有回收就是內(nèi)存泄漏了逢捺,JAVA的回收都由GC去完成谁鳍,垃圾回收機(jī)制會(huì)不停的掃描一個(gè)對(duì)象是或否可以被回收掉,經(jīng)過掃描標(biāo)記回收等操作,那怎么判斷一個(gè)對(duì)象是否可以被回收呢倘潜?JAVA采用了可達(dá)性分析才判斷一個(gè)對(duì)象是否可以被回收绷柒。

image.png

用一個(gè)Activity舉例,當(dāng)Activity被finish之后涮因,就不應(yīng)該在有其他對(duì)象保持對(duì)Activity的引用废睦,否則就會(huì)造成Activity不能被回收,從而造成內(nèi)存泄漏养泡,也就是上面分析Handler引起內(nèi)存泄漏的原因嗜湃。總結(jié)起來就是一句話澜掩,生命周期短的對(duì)象引用了生命周期長(zhǎng)的對(duì)象购披,從而造成生命周期短的對(duì)象不能正常回收肩榕,從而造成了內(nèi)存泄漏刚陡。

生命周期長(zhǎng)的對(duì)象比方說靜態(tài)對(duì)象,常駐線程株汉,單例等筐乳,使用長(zhǎng)生命周期對(duì)象時(shí)一定要注意內(nèi)存泄漏。
在回到上面的Handler內(nèi)存泄漏的問題乔妈,其實(shí)只要切斷引用連蝙云,內(nèi)存泄漏就解決了,可以在Activirty結(jié)束的時(shí)候褒翰,如果有未執(zhí)行完的Message可以remove掉贮懈,android studio上也提示了另外一種解決辦法,靜態(tài)Handler+弱引用优训。
說到弱引用朵你,就要說到JAVA幾種常用的引用方式,強(qiáng)揣非、軟抡医、弱、虛早敬。上面說的可達(dá)性分析等都是強(qiáng)引用忌傻,而軟件引用在系統(tǒng)內(nèi)存不足時(shí)會(huì)被強(qiáng)制釋放掉,需注意從2.3開始搞监,android加強(qiáng)了軟引用的回收水孩。弱引用的回收比軟引用來的更快,如果垃圾回收時(shí)琐驴,只有弱引用對(duì)此對(duì)象保持引用則會(huì)被回收俘种。所以靜態(tài)Handler+弱引用秤标,靜態(tài)保證了不持有當(dāng)前Activity對(duì)象,而弱引用拿到了當(dāng)前Activity的句柄宙刘。所以只要注意對(duì)象的生命周期還有引用方式苍姜,內(nèi)存泄漏就自然解決了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悬包,一起剝皮案震驚了整個(gè)濱河市衙猪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌布近,老刑警劉巖垫释,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吊输,居然都是意外死亡饶号,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門季蚂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人琅束,你說我怎么就攤上這事扭屁。” “怎么了涩禀?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵料滥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我艾船,道長(zhǎng)葵腹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任屿岂,我火速辦了婚禮践宴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘爷怀。我一直安慰自己阻肩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布运授。 她就那樣靜靜地躺著烤惊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吁朦。 梳的紋絲不亂的頭發(fā)上柒室,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音逗宜,去河邊找鬼雄右。 笑死空骚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的不脯。 我是一名探鬼主播府怯,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼防楷!你這毒婦竟也來了牺丙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤复局,失蹤者是張志新(化名)和其女友劉穎冲簿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亿昏,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峦剔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了角钩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吝沫。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖递礼,靈堂內(nèi)的尸體忽然破棺而出惨险,到底是詐尸還是另有隱情,我是刑警寧澤脊髓,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布辫愉,位于F島的核電站,受9級(jí)特大地震影響将硝,放射性物質(zhì)發(fā)生泄漏恰聘。R本人自食惡果不足惜耽梅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧产禾,春花似錦买优、人聲如沸厕氨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弟翘。三九已至虫腋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間稀余,已是汗流浹背悦冀。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留睛琳,地道東北人盒蟆。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓踏烙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親历等。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讨惩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏...
    _痞子閱讀 1,626評(píng)論 0 8
  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題寒屯。內(nèi)存泄漏...
    神奇的小蘑菇閱讀 523評(píng)論 0 0
  • Android 內(nèi)存泄漏總結(jié) 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題荐捻。內(nèi)存泄漏...
    apkcore閱讀 1,219評(píng)論 2 7
  • 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏大家都不陌生了寡夹,簡(jiǎn)單粗俗的講处面,...
    DreamFish閱讀 791評(píng)論 0 5
  • 內(nèi)存管理的目的就是讓我們?cè)陂_發(fā)中怎么有效的避免我們的應(yīng)用出現(xiàn)內(nèi)存泄漏的問題。內(nèi)存泄漏大家都不陌生了菩掏,簡(jiǎn)單粗俗的講魂角,...
    宇宙只有巴掌大閱讀 2,361評(píng)論 0 12