Android中內(nèi)存泄露與內(nèi)存溢出

面試中經(jīng)常會問到什么是內(nèi)存泄露?什么又是內(nèi)存溢出扫沼?
今天就來好好總結(jié)一下出爹。

一、內(nèi)存泄露 ( memory leak )

垃圾回收器無法回收原本應(yīng)該被回收的對象充甚,這個對象便引發(fā)了內(nèi)存泄露以政。
內(nèi)存泄露的危害:

(1)過多的內(nèi)存泄露最終會導致內(nèi)存溢出(OOM)
(2)內(nèi)存泄露導致可用內(nèi)存不足,會觸發(fā)頻繁GC伴找,不管是Android2.2以前的單線程GC還是現(xiàn)在的CMS和G1盈蛮,都有一部分的操作會導致用戶線程停止(就是所謂的Stop the world),從而導致UI卡頓技矮。

二抖誉、內(nèi)存溢出(OOM-out of memory)

程序在申請內(nèi)存時,沒有足夠的內(nèi)存空間供其使用衰倦,出現(xiàn)out of memory袒炉;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出樊零。

Android為每個進程設(shè)置Dalvik Heap Size閾值我磁,這個閾值在不同的設(shè)備上會因為RAM大小不同而各有差異孽文。如果APP想要分配的內(nèi)存超過這個閾值,就會發(fā)生OOM夺艰。

ActivityManager.getMemoryClass()可以查詢當前APP的Heap Size閾值芋哭,單位是MB。

在3.x以前郁副,Bitmap分配在Native heap中减牺,而在4.x之后,Bitmap分配在Dalvik或ART的Java heap中存谎。

Android 2.x系統(tǒng)拔疚,當dalvik allocated + native allocated + 新分配的大小 >= dalvik heap 最大值時候就會發(fā)生OOM,也就是說在2.x系統(tǒng)中,考慮native heap對每個進程的內(nèi)存限制。

Android 4.x系統(tǒng),廢除了native的計數(shù)器,類似bitmap的分配改到dalvik的java heap中申請峦耘,只要allocated + 新分配的內(nèi)存 >= dalvik heap 最大值的時候就會發(fā)生OOM(art運行環(huán)境的統(tǒng)計規(guī)則還是和dalvik保持一致),也就是說在4.x系統(tǒng)中顷歌,不考慮native heap對每個進程的內(nèi)存限制物咳,native heap只會收到本機總內(nèi)存(包括RAM以及SWAP區(qū)或分頁文件)的限制。

三旬昭、內(nèi)存泄露的原因

比如當你向系統(tǒng)申請分配內(nèi)存進行使用(new)篙螟,可是使用完了以后卻不歸還(delete),結(jié)果你申請到的那塊內(nèi)存你自己也不能再訪問(也許你把它的地址給弄丟了)问拘,而系統(tǒng)也不能再次將它分配給需要的程序遍略。

1.資源對象沒關(guān)閉
如Cursor,F(xiàn)ile等資源骤坐。他們會在finalize中關(guān)閉绪杏,但這樣效率太低。容易造成內(nèi)存泄漏
SQLiteCurost,當數(shù)據(jù)量大的時候容易泄漏
2.使用Adapter時纽绍,沒有使用系統(tǒng)緩存的converView
3.沒有即時調(diào)用recycle()釋放不再使用的bitmap
4.使用application的context來替代activity相關(guān)的context
不要讓生命周期長于Activity的對象持有到Activity的引用
5.廣播注冊沒取消造成內(nèi)存泄露
6.Handler應(yīng)該申明為靜態(tài)對象蕾久, 并在其內(nèi)部類中保存一個對外部類的弱引用。
7拌夏、Context持有導致內(nèi)存泄漏
Activity Context被傳遞到其他實例中僧著,這可能導致自身被引用而發(fā)生泄漏。
解決:對于大部分非必須使用Activity Context的情況(創(chuàng)建Dialog的Context必須是Activity Context)障簿,應(yīng)該使用Application Context盹愚。
8、記得注銷監(jiān)聽器
注冊監(jiān)聽器的時候會add Listener站故,不要忘記在不需要的時候remove掉Listener皆怕。

內(nèi)存泄露會引發(fā)內(nèi)存溢出。
參考連接:http://blog.csdn.net/mxm691292118/article/details/51020023

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市愈腾,隨后出現(xiàn)的幾起案子朗兵,更是在濱河造成了極大的恐慌,老刑警劉巖顶滩,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件余掖,死亡現(xiàn)場離奇詭異,居然都是意外死亡礁鲁,警方通過查閱死者的電腦和手機盐欺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仅醇,“玉大人冗美,你說我怎么就攤上這事∥龆” “怎么了粉洼?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叶摄。 經(jīng)常有香客問我属韧,道長,這世上最難降的妖魔是什么蛤吓? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任宵喂,我火速辦了婚禮,結(jié)果婚禮上会傲,老公的妹妹穿的比我還像新娘锅棕。我一直安慰自己,他們只是感情好淌山,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布裸燎。 她就那樣靜靜地躺著,像睡著了一般泼疑。 火紅的嫁衣襯著肌膚如雪德绿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天王浴,我揣著相機與錄音脆炎,去河邊找鬼。 笑死氓辣,一個胖子當著我的面吹牛秒裕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播钞啸,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼几蜻,長吁一口氣:“原來是場噩夢啊……” “哼喇潘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梭稚,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颖低,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弧烤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體忱屑,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年暇昂,在試婚紗的時候發(fā)現(xiàn)自己被綠了莺戒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡急波,死狀恐怖从铲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澄暮,我是刑警寧澤名段,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站泣懊,受9級特大地震影響伸辟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗅定,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一自娩、第九天 我趴在偏房一處隱蔽的房頂上張望用踩。 院中可真熱鬧渠退,春花似錦、人聲如沸脐彩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽惠奸。三九已至梅誓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佛南,已是汗流浹背梗掰。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嗅回,地道東北人及穗。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像绵载,于是被迫代替她去往敵國和親埂陆。 傳聞我的和親對象是個殘疾皇子苛白,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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