什么是內(nèi)存泄漏?
有些對象只有有限的生命周期寺枉。當(dāng)它們的任務(wù)完成之后揭芍,它們將被垃圾回收胳搞。如果在對象的生命周期本該結(jié)束的時候,這個對象還被一系列的引用沼沈,這就會導(dǎo)致內(nèi)存泄漏流酬。隨著泄漏的累積,app將消耗完內(nèi)存列另。
比如芽腾,在Activity.onDestroy()被調(diào)用之后,view樹以及相關(guān)的bitmap都應(yīng)該被垃圾回收页衙。如果一個正在運行的后臺線程繼續(xù)持有這個Activity的引用摊滔,那么相關(guān)的內(nèi)存將不會被回收阴绢,這最終將導(dǎo)致OutOfMemoryError崩潰。
尋找內(nèi)存泄漏
尋找內(nèi)存泄漏是一個人工操作的過程艰躺,在Raizlabs的Wrangling Dalvik系列中描述得很清楚呻袭。
下面是關(guān)鍵的步驟:
通過Bugsnag,Crashlytics, 或者Developer Console了解OOM
主動重現(xiàn)問題。你可能需要買或者借或者偷一個遭遇了崩潰的特殊設(shè)備(并不是所有的設(shè)備上都會發(fā)生內(nèi)存泄漏O傩恕)左电。你還需要找出是什么串在一起導(dǎo)致了內(nèi)存泄漏。
當(dāng)OOM出現(xiàn)時進行堆轉(zhuǎn)儲(dump the heap)(這里介紹了如何做).
使用MAT或YourKit內(nèi)存檢測工具檢測內(nèi)存的變化页响,并找出哪個對象應(yīng)該被垃圾回收;
從那個對象到GC roots推斷最短的強引用路徑;
在路徑中找出不存在的引用篓足,并修復(fù)memory leak;
要是有一個庫可以為你做完所有的事情,讓你專注于修復(fù)內(nèi)存泄漏的問題闰蚕,那該有多好栈拖。
LeakCanary是一個開源的在debug版本中檢測內(nèi)存泄漏的java庫。