内存优化
1概述
介绍
内存抖动:锯齿状,GC导致卡顿
内存泄漏,可用内存减少,频繁GC
内存溢出:OOM,程序异常
工具
1Memory Profiler
AS自带实时图表展示应用内存使用量
识别内存泄漏(简单判断)、抖动
提供捕获堆转储、强制GC以及跟踪内存分配的能力
方便直观
线下平时使用
2Memory Analyzer --》MAT
强大的java Heap分析工具,查找内存泄漏及内存占用
生成整体报告、分析问题等
线下深入使用
3LeakCanary
自动内存泄漏检测
也是线下集成
2Android 内存管理机制
java内存管理机制
java内存分配
![](https://img.haomeiwen.com/i14355128/fc329e298f1acd85.png)
java内存回收算法
![](https://img.haomeiwen.com/i14355128/728735ee76ba39fa.png)
![](https://img.haomeiwen.com/i14355128/68acc2eb58b1d2b1.png)
效率不高:需要从头到尾
产生大量不连续碎片
![](https://img.haomeiwen.com/i14355128/5fca6a994461d7e3.png)
![](https://img.haomeiwen.com/i14355128/386d623e94024f17.png)
实现简单,运行相比上一个高效
浪费一半内存,代价大
![](https://img.haomeiwen.com/i14355128/8ead13d399d4b679.png)
![](https://img.haomeiwen.com/i14355128/ae2b3a51663dc674.png)
避免了标记清除导致的内存碎片
避免了复制算法的看空间浪费
![](https://img.haomeiwen.com/i14355128/460a621f86049784.png)
Android内存管理机制
![](https://img.haomeiwen.com/i14355128/7f28398b7922186f.png)
![](https://img.haomeiwen.com/i14355128/469226e7f013078e.png)
![](https://img.haomeiwen.com/i14355128/582af8faf663d2b8.png)
3内存抖动解决实战
内存抖动介绍
定义:内存频繁分配和税收导致的内存不稳定
表现:频繁GC、内存曲线呈锯齿状
危害:卡顿、OOm;频繁创建对象,导致内存不足及不连续,不连续的内存无法被分配,导致OOm。
内存抖动解决实战
使用Memort Profiler初步排查:
![](https://img.haomeiwen.com/i14355128/d4fee06098824726.png)
![](https://img.haomeiwen.com/i14355128/7546714d3113ba5d.png)
![](https://img.haomeiwen.com/i14355128/c17cf0d7060eb453.png)
![](https://img.haomeiwen.com/i14355128/2ad0fbd448901aab.png)
找到了。
4内存泄漏实战解决
内存泄漏介绍
定义:内存中存在已经没有用的对象
表现:内存抖动,可用内存逐渐减少
危害:内存不足,GC频繁,OOM
Memory Analyzer MAT
![](https://img.haomeiwen.com/i14355128/5e8304473b10bd02.png)
内存泄漏实战
![](https://img.haomeiwen.com/i14355128/c663c8bd3e25be7c.png)
![](https://img.haomeiwen.com/i14355128/502cc9b24e865311.png)
Memort Profiler发现 逐渐上升,此时用MAT了
![](https://img.haomeiwen.com/i14355128/9f0e791ccd0c2753.png)
点击进行堆转储
后执行命令
![](https://img.haomeiwen.com/i14355128/4499c55965e4f6c5.png)
用MAT打开
![](https://img.haomeiwen.com/i14355128/0b92bfbc75828696.png)
现在要找到内存泄漏位置
![](https://img.haomeiwen.com/i14355128/8c7866ace8a784ac.png)
Histogram
![](https://img.haomeiwen.com/i14355128/9752d4d91b8a1cf1.png)
![](https://img.haomeiwen.com/i14355128/b140f6d7633fb072.png)
![](https://img.haomeiwen.com/i14355128/e9c673bafd810dc9.png)
当然这里也没有软引用
![](https://img.haomeiwen.com/i14355128/c32aa5ea04f0ccda.png)
左下角有个圆圈 "sCallBacks"
![](https://img.haomeiwen.com/i14355128/6037f1b1207d38bb.png)
添加解决方案
![](https://img.haomeiwen.com/i14355128/53bc660d70982ab1.png)
5全面理解MAT
略
6ARTHook优雅检测不合理图片
Bitmap内存模型
API10之前Bitmap自身在Balvik Heap中,像素在Native中(不占用java 内存;回收时机不确定);
API10之后像素也放在Balvik Heap中;
API26之后,更优的方法又把像素在Native中。
常规方式
背景:图片对内存优化至关重要、图片宽高远大于控件宽高。
实现:继承ImageView,复写实现计算大小。
1侵入性强
2不通用
ARTHook实战
挂钩,将额外的代码勾住原有方法,修改执行逻辑
1运行时插桩
2性能分析
![](https://img.haomeiwen.com/i14355128/ce0dbd17a24c4ea5.png)
![](https://img.haomeiwen.com/i14355128/943063ae6a2ab86f.png)
![](https://img.haomeiwen.com/i14355128/ce862c8363f828d3.png)
![](https://img.haomeiwen.com/i14355128/5787baf7d6845268.png)
![](https://img.haomeiwen.com/i14355128/515ff64585d90e3c.png)
注入
![](https://img.haomeiwen.com/i14355128/892e831bb84c9177.png)
无侵入性
通用性强
兼容问题大,开源方案不能带到线上环境
7线上内存监控方案
常规方案
设定场景线上Dump:Debug.dumpHprofData();将当前内存信息转化成本地文件(比较大,wifi时)
![](https://img.haomeiwen.com/i14355128/3d60c07a55780501.png)
Dump文件太大,和对象数正相关,可裁剪,还有几十兆。
上传失败率高、分析困难。
配合一定策略有一定效果
LeakCanary
LeakCanary带到线上
预设泄漏怀疑点
发现泄漏回传
不适合所有情况,必须预设怀疑点
分析比较耗时,也容易oom
LeakCanary原理
监控生命周期,onDestroy添加RefWatcher检测
二次确认断定发生内存泄漏
分析泄漏找出引用链
监控组件+分析组件
LeakCanary改良
预设怀疑点---》自动找怀疑点
分析泄露链路慢---》分析Retain size大的对象
分析oom---》对象裁剪,不全都加载到内存
完整线上内存监控方案
![](https://img.haomeiwen.com/i14355128/7dfd268697d2e689.png)
8内存优化总结
![](https://img.haomeiwen.com/i14355128/5784e1c600fe1496.png)
优化细节
LargeHeap 属性 --》申请更多内存
onTrimMemory 低内存回调
使用优化过得集合:SparseArray
谨慎使用SharedPreference:第一次会全都加载到内存里;
谨慎使用外部库:未经过大规模验证的
业务架构设计合理
9内存优化模拟面试
你们内存优化怎么做的?
1分析现状 确认问题。
抖动、泄漏 bitmap粗狂
2针对性优化
抖动--》memory profler
3效率提升
使用arthook没有侵入性,写了文档分享给团队。
内存优化最大感受
1磨刀不误砍柴工。
学习memory profler 、Mat后能很快定位解决
2技术优化必须结合业务代码
比如用了多个图片库。
3系统化完善解决方案
如何检测所有不合理的地方
ArtHook
重点强调区别:最初是继承ImageView复写OnDraw方法,但是推广过程中不理想。后来是用ArtHook