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