修复问题背景
用户反馈在查看大量个股详情之后app变的很卡,内存使用占比比较高,严重的时候会造成OOM。
问题产生原因
项目中存在内存泄漏,导致了内存无法释放。
如何排查?
运用Android studio自带的Profiler进行排查,先看下怎么运用这个工具
App运行起来我们可以实时看到App的CPU、Memory、NetWork、Energy等信息,选择要分析的app性能信息,这里选择Memory点进去,生成内存快照,会自动帮我分析出有多少个内存泄漏
我们再看下怎么知道这个内存泄漏发生在哪里,以LaunchActivity为例
通过上面的图可以看出LaunchActivity被作为变量只有了,很有可能是因为是单例里面的Context也有可能是作为全局的静态变量导致的。
接下来具体列举一下我们本次个股里面发生的内存泄漏
1、Handler导致的内存的泄漏
2、Fragment被强引用引起的内存
3、网络请求库里面bindLifecycle(getLifecycleOwner())错用
4、EventBus以及Sub/Pub模型订阅关系,只有订阅未添加取消订阅
5、把控件作为参数传递到Fragment里面导致互相引用
同样以个股详情滑动100只股票为例
优化前:滑动个股详情内存一致暴增,严重时内存过高导致OOM
实测滑动到50只内存到1G,然后产生ANR
优化后:同样的操作,内存基本上稳定在360M左右