内存优化

2018-06-16  本文已影响13人  细雨蒙情

一、内存优化的目的

Android系统给每个app分配的内存是有限的,各个厂商分配的内存大小自己定制,可在清单文件中设置android:largeheap = "true"申请大内存,内存优化的目的主要是:

二、内存优化的手段

可以从四个方面着手,首先是减小对象的内存占用,其次是内存对象的重复利用,然后是避免对象的内存泄露,最后是内存使用策略优化。

1、减小对象的内存占用

2、内存对象的重复利用

3、避免对象的内存泄露

三、内存优化工具

1、LeakCanary的使用和原理

LeakCanary用于监控Activity/Fragment是否发生内存泄漏。一般来说Activty销毁的时候,也就是调用onDestory后,垃圾回收时Activty对象必须被回收,没有的话就说明发生了内存泄漏。LeakCanary是怎样检测某个Activity是否发生内存泄漏的呢?Application中有个方法registerActivityLifecycleCallbacks(),用于监听Activity的生命周期。当监听到Activity调用onDestroy()的时候,通过一个弱引用保存当前Activity对象,并传入一个ReferenceQueue 。引用队列的作用是当引用指向的对象被垃圾回收时,会把引用放入到引用队列中。如果没有放进去,则说明发生了内存泄漏。LeakCanary接着会生成内存快照,并进行分析,找到GC Roots到Activity的引用路径,然后以发送通知的形式告知客户结果。
https://www.jianshu.com/p/3f1a1cc1e964
https://www.jianshu.com/p/70de36ea8b31

2、MAT的使用

以判断某个Activity是否泄漏为例说明MAT的使用方法:
假设现在要确定ActivtityA是否发生了泄漏,那么就先退出ActivityA,手动GC几次,然后生成内存快照,把内存快照放到MAT中进行分析,接着搜索ActivityA,查看Activity是否还存在在内存中,存在的话查看是否有到Gc Root的引用路径,有的话就能知道存在内存泄漏,内存泄漏发生在什么地方。
https://blog.csdn.net/yxz329130952/article/details/50288145
https://blog.csdn.net/junhuahouse/article/details/79731529
https://www.cnblogs.com/ldq2016/p/6632377.html

3、其他工具使用

Memory monitor
https://www.cnblogs.com/ldq2016/p/6628311.html

参考资料

腾讯Bugly Android 内存优化总结&实践
胡凯 Android内存优化之OOM
鸿洋 性能优化专题
Android性能全面分析与优化方案研究—几乎是史上最全最实用的
Android APP 性能优化的一些思考
Android应用开发进阶之性能优化
实践App内存优化:如何有序地做内存分析与优化

上一篇下一篇

猜你喜欢

热点阅读