发现内存泄露
内存泄露问题发现困难,解决容易。大部分内存泄露都是activity的泄露导致的,细分的话又可以分为以下几类:
* 注册/解注册(包括广播、各种系统监听或者自定义监听)
* 单例中的context等
* cursor泄露
* 静态变量
1.人(苦)工(逼)监测
适用于非常简单的项目,比较粗略:
利用Eclipse DDMS或者Android Studio中提供的Memory Monitor检测,配合自动化测试工具或者人工反复进入退出某个activity,观察内存趋势来判断该界面是否有内存泄露。
2. StrictMode
适用于一般项目:
利用android提供的StrictMode监测内存泄露,当出现类存泄露时,通过adb logcat -s StrictMode
命令可以过滤出类似以下样式的log:
android.os.StrictMode$InstanceCountViolation: class com.your.package.name.xxxActivity; instances=2; limit=1
再配合方法1
抓取hprof文件以分析泄露原因。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectAll ().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll ().penaltyLog().build());
}
3.LeakCanary
适用于所有项目:
利用大名鼎鼎的LeakCanary查找内存泄露,该工具可以配合monkey等自动化测试工具。在出现内存泄露时通知栏会显示泄露的地方,并可以查看详细的泄露路径。LeakCanary的使用参考Android Studio中LeakCanary的使用