1.1. 内存泄露检测
1.1.1. AndroidStudio
(1)查看内存使用情况
(2)页面关掉后,可以手动GC,如果内存没变的话代表这个时候有明显泄露
(3)导出hrof文件,先点 这个图标
再点击MemoryUsage
(4)
(5)可以导出标准hrof文件,并用MAT分析查看
1.1.2. 简单快捷的方式LeakCanary
注意:使用leakCanary的时候,在5.0以下的版本会出现Caused by: java.lang.NoClassDefFoundError,所以,测试完内存泄露后,记得删掉代码
(1)在app的build.gradle里面添加,下面的配置:
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
(2)在主Application里面添加如下代码:
LeakCanary.install(this);
(3)如上步骤添加完后运行app即可检测内存泄露情况,LeakCanary会自动通知系统哪个页面出现泄露
1.2. 内存泄露一般原因
1、内部类的使用(handler的使用一般也是如此)
解决方式:用内部静态类,对当前对象进行弱引用
2、context的引用
解决方式:尽量使用周期长的系统ApplicationContext
3、线程未关闭
4、系统本身的bug,如
5.1系统会出现TextLine.sCache的泄露
6.0版本会出现InputMethodManager的泄露