android 內(nèi)存泄漏和內(nèi)存溢出

內(nèi)存溢出(out of memory)

OOM指當前對象的內(nèi)存占用已經(jīng)超出分配內(nèi)存的大小,這時未處理的異常就會拋出芝发。過多的內(nèi)存泄露會導致內(nèi)存溢出,造成程序崩潰

造成內(nèi)存溢出的原因:

1.內(nèi)存泄漏導致苛谷;2.占用內(nèi)存比較多的對象

如常見的內(nèi)存溢出:

bitmap過大(顯示像素過高或者圖片尺寸遠遠大于顯示空間尺寸時辅鲸。通常要將bitmap縮放,減少暫占用內(nèi)存)腹殿;

引用沒釋放(長時間保持某些資源的引用独悴,導致GC(garbage collection垃圾回收)無法回收例书,該對象占用的內(nèi)存就無法被使用。如activity被引用刻炒,在調(diào)用finish()之后卻沒有釋放决采,第二次打開又重新創(chuàng)建,這樣的內(nèi)存泄露不斷發(fā)生坟奥,就會導致內(nèi)存的溢出)树瞭;

資源對象沒關閉(Cursor/file等資源,會在finalize中關閉爱谁,但效率過低晒喷,易造成內(nèi)存泄漏;SQLiteCurost當數(shù)據(jù)量大的時候容易泄漏)访敌;

內(nèi)存泄漏(memory leak)

有一些對象只有有限的生命周期厨埋。當它們的任務完成了之后,將會被GC回收捐顷。如果在對象的生命周期本該結束的時候荡陷,還被一系列的引用,就會導致內(nèi)存泄漏迅涮。隨著泄漏的累積废赞,app將消耗完內(nèi)存。
如Activity.onDestory()被調(diào)用之后叮姑,view樹和bitmap應該都被GC回收唉地。如果一個正在運行的后臺線程繼續(xù)持有這個activity的引用,那么相關的內(nèi)存將不會被回收传透,最終導致out OfMemoryError崩潰耘沼。
memory leak最終會導致OOM
內(nèi)存泄漏的原因:
1.資源對象沒關閉、集合類內(nèi)存泄漏(資源對象沒關閉:Cursor/file等資源朱盐,會在finalize中關閉群嗤,但效率過低,易造成內(nèi)存泄漏兵琳;SQLiteCurost當數(shù)據(jù)量大的時候容易泄漏)狂秘,屬性動畫在activity onDestory()的時候 animator.cancel()來停止動畫

2.使用adapter時沒有使用系統(tǒng)緩存的converview

3.沒有及時調(diào)用recycle()釋放不再使用的bitmap(釋放之后建議bitmap= null;避免GC回收過慢等原因)

4.上下文的context用的是activity或者fragment。因此要使用application的context來代替activity相關的context躯肌,否則會在activity者春、fragment銷毀時也不會銷毀其內(nèi)存(不要讓生命周期長于activity的對象持有activity的引用)
在以下情況下不可以使用application
a.對話框創(chuàng)建的上下文
b.跳轉(zhuǎn)到其它activity的上下文
c.創(chuàng)建布局layout或view要用到的上下文

5.廣播注冊沒取消造成的內(nèi)存泄漏

6.handler應該申請為static對象,并且在內(nèi)部類中保存一個對外部類的弱引用

內(nèi)存泄漏的分類:

1.常發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行清女,每次執(zhí)行都會導致一塊內(nèi)存泄漏

2.偶發(fā)性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只有在特定環(huán)境或操作過程中才會發(fā)生钱烟。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性可能會變成常發(fā)性拴袭。因此測試環(huán)境和測試方法對檢測內(nèi)存泄漏尤其重要

3.一次性內(nèi)存泄漏:發(fā)生內(nèi)存泄漏的代碼只會執(zhí)行一次传惠,或者由于算法上的缺陷,導致總有一塊僅且有一塊內(nèi)存發(fā)生泄漏稻扬。如在類的構造函數(shù)中分配內(nèi)存,在析構函數(shù)中卻沒有釋放該內(nèi)存,導致內(nèi)存泄漏只會發(fā)生一次

4.隱私內(nèi)存泄漏:程序在運行過程中不停地分配內(nèi)存。但是在結束的時候才釋放內(nèi)存讨跟。嚴格來說并沒有發(fā)生內(nèi)存泄漏使碾,因為程序最終還是釋放了所有的內(nèi)存。但是對于一個服務程序徘禁。需要運行幾天甚至幾個月。不及時釋放內(nèi)存也可能導致最終耗盡所有的內(nèi)存。稱這種內(nèi)存泄漏為隱私內(nèi)存泄漏

內(nèi)存泄漏和內(nèi)存溢出都不能通過try catch處理

內(nèi)存泄漏的檢測工具:leakcanary
參考來源

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黔宛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子擒贸,更是在濱河造成了極大的恐慌臀晃,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件介劫,死亡現(xiàn)場離奇詭異徽惋,居然都是意外死亡,警方通過查閱死者的電腦和手機座韵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門险绘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人誉碴,你說我怎么就攤上這事宦棺。” “怎么了黔帕?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵代咸,是天一觀的道長。 經(jīng)常有香客問我成黄,道長侣背,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任慨默,我火速辦了婚禮贩耐,結果婚禮上,老公的妹妹穿的比我還像新娘厦取。我一直安慰自己潮太,他們只是感情好,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铡买,像睡著了一般更鲁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奇钞,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天澡为,我揣著相機與錄音,去河邊找鬼景埃。 笑死媒至,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的谷徙。 我是一名探鬼主播拒啰,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼完慧!你這毒婦竟也來了谋旦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤屈尼,失蹤者是張志新(化名)和其女友劉穎册着,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脾歧,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡指蚜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涨椒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摊鸡。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蚕冬,靈堂內(nèi)的尸體忽然破棺而出免猾,到底是詐尸還是另有隱情,我是刑警寧澤囤热,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布猎提,位于F島的核電站,受9級特大地震影響旁蔼,放射性物質(zhì)發(fā)生泄漏锨苏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一棺聊、第九天 我趴在偏房一處隱蔽的房頂上張望伞租。 院中可真熱鬧,春花似錦限佩、人聲如沸葵诈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽作喘。三九已至理疙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞坦,已是汗流浹背窖贤。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留贰锁,地道東北人赃梧。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像李根,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子几睛,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354