一、常见的内存泄漏场景及其常见的解决方案
-
常见的内存泄漏场景:
1、单例设计模式造成的内存泄漏
2、非静态内部类创建的静态实例造成的内存泄漏
3、Handler造成的内存泄漏
4、线程造成的内存泄漏
5、资源未关闭造成的内存泄漏 -
常见的解决方案(思路)
1、尽量使用Application的Context而不是Activity的漏
2、使用弱引用或者软引用漏
3、手动设置null,解除引用关系漏
4、将内部类设置为static,不隐式持有外部的实例漏
5、注册与反注册成对出现,在对象合适的生命周期进行反注册操作。漏
6、如果没有修改的权限,比如系统或者第三方SDK,可以使用反射进行解决持有关系
7、在使用完BraodcastReceiver,ContentObserver,File,Cursor,Stream,Bitmap等资源时,一定要在Activity中的OnDestry中及时的关闭、注销或者释放内存,
二、使用leakcanary 定位并解决内存泄漏问题
使用方法
1.引入相关包
dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.6.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1' }
2.在application 中注册
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);其返回值就是RefWatcher,可用于单独监测某一个类的内存泄漏问题
(解释一下为什么要先判断LeakCanary.isInAnalyzerProcess(this)
在注册之前先判断LeakCanary是否已经运行在手机上,比如你同时有多个APP集成了LeakCanary,其他app已经运行了LeakCanary则不需要重新install)
补充可以用LeakCanary监听指定对象的内存泄漏
如果想让LeakCanary监听指定对象的内存泄漏,我们就需要使用到RefWatcher
的watch
功能
用法:获取到application 中install 的返回值,然后在需要监测的类中的oncreate中调用RefWatcher().watch(this);即可。
3.内存泄漏问题暴露入口
(1)在notification 中会有提示
(2)桌面上生成一个Leaks的图标,这个就是展示内存泄漏列表的