開(kāi)篇之前,我們要先理解:什么是內(nèi)存泄漏诚纸。
百度百科:內(nèi)存泄漏(Memory Leak)是指程序中己動(dòng)態(tài)分配的堆內(nèi)存由于某種原因程序未釋放或無(wú)法釋放杈曲,造成系統(tǒng)內(nèi)存的浪費(fèi),導(dǎo)致程序運(yùn)行速度減慢甚至系統(tǒng)崩潰等嚴(yán)重后果剪芥。
內(nèi)存泄漏的影響上面也說(shuō)的很清楚了,所以我們需要發(fā)現(xiàn)內(nèi)存泄漏琴许,并解決內(nèi)存泄漏税肪。
在Android中,要如何發(fā)現(xiàn)內(nèi)存泄漏呢榜田?
我目前有用到兩種方法益兄,第一種是用Android Studio,這個(gè)方法可以檢測(cè)Activity的內(nèi)存泄漏箭券;第二種是使用LeakCanary净捅,可以檢測(cè)所有內(nèi)存泄漏。
第一種方法:
我目前用的是Android Studio邦鲫,Android Studio有一個(gè)自帶的檢測(cè)內(nèi)存泄漏的方法灸叼。
首先,打開(kāi)Monitor界面:
然后庆捺,打開(kāi)APP古今,測(cè)試APP有內(nèi)存泄漏嫌疑的界面,點(diǎn)擊下圖按鈕滔以,強(qiáng)制GC:
接下來(lái)捉腥,點(diǎn)擊下圖所示按鈕,進(jìn)入HPROF Viewer界面你画,查看Java的Heap:
然后,點(diǎn)擊上圖所示的“Analyzer Tasks”按鈕坏匪,打開(kāi)Analyzer Tasks界面:
點(diǎn)擊上圖所示按鈕拟逮,開(kāi)始分析內(nèi)存泄漏,結(jié)果如下圖所示:
如上圖所示适滓,出現(xiàn)了兩個(gè)內(nèi)存泄漏敦迄,可以根據(jù)箭頭所指區(qū)域的信息修改內(nèi)存泄漏問(wèn)題。
第二種方法:
LeakCanary是一個(gè)開(kāi)源的在debug版本中檢測(cè)內(nèi)存泄漏的java庫(kù)凭迹。
GitHub地址為:https://github.com/square/leakcanary
根據(jù)GitHub上的說(shuō)明文檔罚屋,集成LeakCanary:
在app的build.gradle中,加入以下代碼:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1'
}
在自定義Application中加入以下代碼:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
然后嗅绸,就可以直接使用了脾猛。
LeakCanary除了會(huì)在界面中顯示泄漏信息之外,Log中也一樣會(huì)輸出泄漏的具體信息鱼鸠。我們可以根據(jù)這些信息解決內(nèi)存泄漏問(wèn)題猛拴。