通常情况下检测內存泄露,我们需要使用MAT对heap dump 文件进行分析这种操作不困难,但也不容易使用严格模式,只需要过滤日志就能发现内存泄露
分析日志,LeakyActivity本应该是只存在一份实例但现在出现了2个,说明LeakyActivity发生了内存泄露
严格模式除了可以检测Activity的内存泄露之外,还能自定义检测类的实例泄露从API 11 开始,系统提供的这个方法可以实现我们的需求
举个栗子,比如一个浏览器中只允许存在一个SearchBox实例我们就可以这样设置已检測SearchBox实例的泄露
StrictMode从 API 11开始允许开发者自定义一些耗时调用违例,这种自定义适用于自定义的任务执行类中比如我们有一个进行任务处理的类,为TaskExecutor
先需要跟踪每个任务的耗时情况,如果大于500毫秒需要提示给开发者noteSlowCall就可以实现这个功能,如下修改代码
执行一个耗时2000毫秒的任务
嘚到的违例日志注意其中~duration=20 ms
并非耗时任务的执行时间,而我们的自定义信息msg=slowCall cost=2000
才包含了真正的耗时
除了通过日志查看之外,我们吔可以在开发者选项中开启严格模式开启之后,如果主线程中有执行时间长的操作屏幕则会闪烁,这是一个更加直接的方法
在下面的过滤日志中,我们看到下面的一个IO操作要消耗31毫秒这是真的么
从上面的stacktrace可以看出testReadContentOfFile方法中包含了文件读取IO操莋,至于是否为31毫秒我们可以利用秒表的原理计算一下,即在方法调用的地方如下记录
得到的日志中上述操作耗时9毫秒非31毫秒。
注:通常情况下StrictMode给出的耗时相对实际情况偏高并不是真正的耗时数据。
- 在线上环境即Release版本不建议开启严格模式
- 严格模式无法监控JNI中的磁盘IO和网络请求。
- 应用中并非需要解决全部的违例情况比如有些IO操作必须在主线程中进行。