Android 內(nèi)存泄漏是一個(gè)十分頭疼的事情塞关。LeakCanary是一款開(kāi)源軟件晕讲,主要作用是檢測(cè) Android APP 內(nèi)存泄露贵白。比起以前的 MAT 工具抚芦,LeakCanary 有著十分強(qiáng)大的功能倍谜,能夠在程序發(fā)送內(nèi)存泄漏的時(shí)候提示通知,而且學(xué)習(xí)成本低叉抡。同時(shí)提供 log 和 hrpof 日志尔崔,便于開(kāi)發(fā)者解決問(wèn)題。
什么是內(nèi)存泄露褥民?
一些對(duì)象有著有限的生命周期季春。當(dāng)這些對(duì)象所要做的事情完成了,我們希望他們會(huì)被回收掉轴捎。但是如果有一系列對(duì)這個(gè)對(duì)象的引用鹤盒,那么在我們期待這個(gè)對(duì)象生命周期結(jié)束的時(shí)候被收回的時(shí)候蚕脏,它是不會(huì)被回收的。它還會(huì)占用內(nèi)存侦锯,這就造成了內(nèi)存泄露驼鞭。持續(xù)累加,內(nèi)存很快被耗盡尺碰。
如何使用LeakCanary挣棕?
1.添加依賴
dependencies {
//leakcanary
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'
// or 1.4-beta1
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
// or 1.4-beta1
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1'
}
2.Application中調(diào)用
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
LeakCanary.install(this);
}
}
LeakCanary使用關(guān)鍵步驟?
1.通過(guò) Bugsnag, Crashlytics 或者 Developer Console 等統(tǒng)計(jì)平臺(tái)亲桥,了解 OutOfMemoryError
情況洛心。
2.重現(xiàn)問(wèn)題。為了重現(xiàn)問(wèn)題题篷,機(jī)型非常重要词身,因?yàn)橐恍﹩?wèn)題只在特定的設(shè)備上會(huì)出現(xiàn)。為了找到特定的機(jī)型番枚,你需要想盡一切辦法法严,你可能需要去買(mǎi),去借葫笼,甚至去偷深啤。 當(dāng)然,為了確定復(fù)現(xiàn)步驟路星,你需要一遍一遍地去嘗試溯街。一切都是非常原始和粗暴的。
3.在發(fā)生內(nèi)存泄露的時(shí)候洋丐,把內(nèi)存 Dump 出來(lái)呈昔。具體看這里。
4.然后友绝,你需要在 MAT 或者 YourKit 之類的內(nèi)存分析工具中反復(fù)查看韩肝,找到那些原本該被回收掉的對(duì)象。
5.計(jì)算這個(gè)對(duì)象到 GC roots 的最短強(qiáng)引用路徑九榔。
6.確定引用路徑中的哪個(gè)引用是不該有的哀峻,然后修復(fù)問(wèn)題。