Android內存泄漏分析及MAT工具使用

1.內存泄漏是什么

  • 一句話概括:就是GC垃圾回收機制漏掉的垃圾對象绊序,無法回收
  • 內存泄漏過多就會造成內存溢出

2.什么是垃圾回收機制?

就是當對象不具備任何引用的時候岗宣,可被回收

3.GC ROOT Tracing 算法

GC Root Tracing
  • 被GC Root 引用的對象不可被回收
  • 沒有被GC Root Obj所持有的對象可以被回收

4.可以作為GC Root引用的點是(不被回收):

  • java stack中引用的對象
  • 方法區(qū)中靜態(tài)引用指向的對象
  • 方法去中常量引用指向的對象
  • Native方法中jni引用的對象
  • Thread—活著的線程

5.常見的內存泄漏案例:

參考QQ空間Android內存泄漏分析心得

  • 1:單例造成的內存泄漏

    • 解決方案
      • 將該屬性的引用方式改為弱引用;
      • 如果傳入Context,使用ApplicationContext;
  • 2: InnerClass匿名內部類

    • 在Java中趁猴,非靜態(tài)內部類 和 匿名類 都會潛在的引用它們所屬的外部類儡司,但是余指,靜態(tài)內部類卻不會。如果這個非靜態(tài)內部類實例做了一些耗時的操作碉碉,就會造成外圍對象不會被回收垢粮,從而導致內存泄漏靠粪。
    • 解決方案
      • 將內部類變成靜態(tài)內部類;
      • 如果有強引用Activity中的屬性毫蚓,則將該屬性的引用方式改為弱引用;
      • 在業(yè)務允許的情況下元潘,當Activity執(zhí)行onDestory時柬批,結束這些耗時任務;
  • 3:Activity Context 的不正確使用

    • 在Android應用程序中通承涠可以使用兩種Context對象:Activity和Application洛姑。當類或方法需要Context對象的時候常見的做法是使用第一個作為Context參數。這樣就意味著View對象對整個Activity保持引用参咙,因此也就保持對Activty的所有的引用硫眯。
    • 解決方案
      • 使用ApplicationContext代替ActivityContext两入,因為ApplicationContext會隨著應用程序的存在而存在,而不依賴于activity的生命周期择葡;
      • 對Context的引用不要超過它本身的生命周期剃氧,慎重的對Context使用“static”關鍵字朋鞍。Context里如果有線程,一定要在onDestroy()里及時停掉更舞。
  • 4:Handler引起的內存泄漏

    • 當Handler中有延遲的的任務或是等待執(zhí)行的任務隊列過長恨狈,由于消息持有對Handler的引用,而Handler又持有對其外部類的潛在引用贝搁,這條引用關系會一直保持到消息得到處理芽偏,而導致了Activity無法被垃圾回收器回收,而導致了內存泄露膀哲。
    • 解決方案
      • 可以把Handler類放在單獨的類文件中某宪,或者使用靜態(tài)內部類便可以避免泄露;
      • 如果想在Handler內部去調用所在的Activity,那么可以在handler內部使用弱引用的方式去指向所在Activity.使用Static + WeakReference的方式來達到斷開Handler與Activity之間存在引用關系的目的锐朴。
  • 5:注冊監(jiān)聽器的泄漏

    • 解決方案
      • 使用ApplicationContext代替ActivityContext;
      • 在Activity執(zhí)行onDestory時焚志,調用反注冊;
  • 6:Cursor,Stream沒有close壶谒,View沒有recyle

  • 7:集合中對象沒清理造成的內存泄漏

    • 在Activity退出之前汗菜,將集合里的東西clear贵少,然后置為null,再退出程序。
  • 8: WebView造成的泄露

    • 當我們不要使用WebView對象時吼肥,應該調用它的destory()函數來銷毀它缀皱,并釋放其占用的內存,否則其占用的內存長期也不能被回收表箭,從而造成內存泄露钮莲。
  • 9:構造Adapter時彼水,沒有使用緩存的ConvertView

6.使用AndroidStudio進行內存分析

步驟如下:

圖1:


圖1

圖2:


圖2
圖2

7.通過MAT工具進行分析

第一步:如下圖先導出標準的hprof文件〔鹞海可以生成兩個hprof文件渤刃,通過MAT比較分析。


圖1

第二步:打開MAT工具略号,可以單獨下載這個插件下載

圖2

第三步:導入兩個hprof文件璃哟,根據下圖的步驟進行比較分析


圖3

第四步:按照下圖步驟選擇


圖4

最后:找到未釋放的引用


圖5

參考:
QQ空間Android內存泄漏分析心得

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铐伴,隨后出現的幾起案子俏讹,更是在濱河造成了極大的恐慌,老刑警劉巖户矢,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯浪,死亡現場離奇詭異瓢娜,居然都是意外死亡,警方通過查閱死者的電腦和手機虏劲,發(fā)現死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門励堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吻育,“玉大人,你說我怎么就攤上這事摊趾∮瘟剑” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵肛炮,是天一觀的道長侨糟。 經常有香客問我,道長秕重,這世上最難降的妖魔是什么厉膀? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任服鹅,我火速辦了婚禮,結果婚禮上企软,老公的妹妹穿的比我還像新娘。我一直安慰自己聚蝶,他們只是感情好藻治,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布桩卵。 她就那樣靜靜地躺著,像睡著了一般胜嗓。 火紅的嫁衣襯著肌膚如雪钩乍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天变过,我揣著相機與錄音涝涤,去河邊找鬼。 笑死崭孤,一個胖子當著我的面吹牛糊肠,可吹牛的內容都是我干的。 我是一名探鬼主播货裹,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼派殷,長吁一口氣:“原來是場噩夢啊……” “哼墓阀!你這毒婦竟也來了?” 一聲冷哼從身側響起经伙,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤勿锅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垮刹,有當地人在樹林里發(fā)現了一具尸體张弛,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡酪劫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年覆糟,在試婚紗的時候發(fā)現自己被綠了滩字。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片御吞。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魄藕,死狀恐怖,靈堂內的尸體忽然破棺而出背率,到底是詐尸還是另有隱情,我是刑警寧澤交排,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布饵筑,位于F島的核電站,受9級特大地震影響架专,放射性物質發(fā)生泄漏玄帕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一委刘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锡移,春花似錦漆际、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婴洼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欢唾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工礁遣, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祟霍,地道東北人盈包。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像崭添,于是被迫代替她去往敵國和親叛氨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • Android 內存泄漏總結 內存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應用出現內存泄漏的問題。內存泄漏...
    _痞子閱讀 1,637評論 0 8
  • 內存管理的目的就是讓我們在開發(fā)中怎么有效的避免我們的應用出現內存泄漏的問題缰犁。內存泄漏大家都不陌生了怖糊,簡單粗俗的講,...
    宇宙只有巴掌大閱讀 2,363評論 0 12
  • 作者:小強 貝聊移動開發(fā)部 Android工程師 1.Java內存分配策略 Java 程序運行時的內存分配策略有三...
    貝聊科技閱讀 2,148評論 1 7
  • 章節(jié)一 坐上一輛公交車,發(fā)現車廂空蕩扰魂,找個自己喜歡的位置蕴茴,坐下。 窗外都是熟悉的燈光姐直,熟悉的路,安靜看著撞叽,感覺自己...
    筆尖的舞蹈閱讀 135評論 0 0
  • 這兩天一直挺忙的插龄,親子日記也沒時間寫了,晚上補上吧糠雨∨枪颍快要過中秋了,這兩天我都在家做月餅真椿,親戚比較多,晚上都要做到半...
    王鐿皓媽媽閱讀 114評論 0 0