一、内存泄露与内存溢出的区别.
内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放。结果导致一直占据该内存单元,我们和程序
都无法再使用该内存单元,直到程序结束,这是内存泄露。(泄露原因:无用对象,但可到达)
内存溢出:程序向系统申请的内存空间超出了系统能给的。比如内存只能分配一个int类型,我却要塞给他一个long类型,
系统就出现oom。又比如一车最多能坐5个人,你却非要塞下10个,车就挤爆了。
大量的内存泄露会导致内存溢出(oom)。
二、使用LeakCanary检测内存是否泄露.
1.在module的build.gradle中的dependencies加入:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android:1.5'
testImplementation 'com.squareup.leakcanary:leakcanary-android:1.5'
2.在自定义的Applicaton中加入:
private RefWatcher refWatcher;
@Override
public void onCreate() {
super.onCreate();
refWatcher = setupLeakCanary();
}
private RefWatcher setupLeakCanary() {
if (LeakCanary.isInAnalyzerProcess(this)) {
return RefWatcher.DISABLED;
}
return LeakCanary.install(this);
}
public static RefWatcher getRefWatcher(Context context) {
App app = (App) context.getApplicationContext();
return app.refWatcher;
}
3.在AndroidManifest.xml中注册自定义的Application即可。
三、集成LeakCanary后,出现内存泄漏会在通知栏出现内存泄漏信息,如下图:
注意:真机上测试没有出现在通知栏上,而是直接在手机桌面有个图标,点击进去就可以查看内存泄漏信息了。
点击详情后,就可以 查看具体内存泄漏信息,如下图: