程序员Android性能优化

MAT内存泄露分析(二)

2017-09-08  本文已影响21人  大大大大大先生

宝贝中心头像切换

微聊模块

定位模块

登录模块

这里写图片描述这里写图片描述

由于MainActivity没有释放,所以导致里Bitmap占用的内存也没有被释放


这里写图片描述这里写图片描述

MainActivity泄漏导致里面的Bitmap无法被回收,导致7.9MB的内存可能出现问题


这里写图片描述这里写图片描述
Gc roots:
这里写图片描述这里写图片描述
可能存在的问题代码MainActivity类:
这里写图片描述这里写图片描述

进入主界面后MainActivity没有finish掉
修改建议:在启动HomePageActivity之后把MainActivity finish掉

通讯录模块

这里写图片描述这里写图片描述

Gc roots:


这里写图片描述这里写图片描述
这里写图片描述这里写图片描述
这里写图片描述这里写图片描述
这里写图片描述这里写图片描述

代码问题:


这里写图片描述这里写图片描述
umengSocialUtil在创建的时候直接使用当前activity对象作为参数,但是这个参数必须传activity对象,所以修改建议是:对UmengSocialUtil做修改,因为这个activity对象会保存到友盟分享sdk的一些类里面,当activity退出的时候把UmengSocialUtil里面的相关对象释放掉

修改设置类开关

com.xtc.watch.view.message.helper.MessageControl存在内存泄漏:


这里写图片描述这里写图片描述

我反复gc,过了很久之后再次gc,上述对象依然没有被回收
Gc roots:


这里写图片描述这里写图片描述
问题代码:
这里写图片描述这里写图片描述

线程中执行的是数据库操作实现异步,但是我并不明白在子线程中加Looper.prepare()和Looper.loop()干嘛?又没有弹Toast?loop()方法是一个死循环,导致这个线程一直无法结束所以一直存在,因此线程中的对象无法被释放,同时这个线程也占用了内存资源

APP设置模块

主界面

这里写图片描述这里写图片描述

丫的我都已经退出登录了,正常的话主界面应该已经被回收了,所以不会再有HomePageActivity的对象存在了
Gc roots:


这里写图片描述这里写图片描述

话不多,有几个地方同时持有了HomePageActivity的引用
修改建议:传参数Context的时候如果不是必须用Activity就尽量用全局的ApplicationContext,或者在Activity的onDestroy把一些引用手动设置为null,但是这个好像没用,搜索了网上的解决方案发现展示webview界面可以单独开启一个进程,退出后再杀死这个进程,这样就不会造成webview的内存泄漏了,个人觉得这个靠谱,可以尝试

单例内存问题

发现一个问题,当app使用了很多模块之后,有很多单例实现的ServiceImpl类其实在退出后可能并不会频繁的调用到,但是单例对象还是占用这内存的,虽然占用的内存非常小,有几十B,也有两三百B,优化建议:可以采用弱引用来持有单例

上一篇 下一篇

猜你喜欢

热点阅读