本周公司项目解决内存泄漏,使用Android studio profiler工具进行分析。
在人工monkey测试点击管理页面各项菜单后,工具内存查看页面看到内存有增长不是释放的情况。但是dump后未发现哪个页面 或明确的对象没有释放。多次对比dump发现内存并没有明显增加。
持续几天未找到原因,后仔细发现,增加的内存属于Others部分,该部分官方解锁是:未知分类的不。这部分在dump后也没有明确的对象对应,因此更难找到内存泄漏的地方了。如下图
今天在朋友的帮助下得到了解决。朋友提醒可能是raw资源泄漏,然后就是仔细观察什么操作会使Others部分增加。根据该思路分析,发现是点击菜单都会有点波动,说明是每个菜单的公用逻辑出了问题。仔细分析发现公用逻辑就是切面点击拦截事件,果断去掉拦截,测试发现正常。然后再认真分析拦截里面的逻辑:播放按键音,记录日志,放重复点击三个主要逻辑。想到朋友提醒的raw资源,果断怀疑是播放按键音的问题。进入方法查看,发现每次播放都会使用系统的 SoundPool load一次按键音资源,然后播放。播放结束未释放。找到根本原因,改之。
总结本次问题难发现原因是第一次遇到系统加载raw等资源类导致的oom,其增长的内存可能无法分类,放在了Others里面,dump也无法明确发现。
PS:若有其他更好的方式揪出此类泄漏点,请留言互相讨论学习。