内存优化的三个方面
APP 内存优化一般从 内存抖动,内存泄露,内存溢出这三个方面进行分析。
内存抖动
内存抖动是内存频繁分配和回收,导致可用内存不稳定。
内存图是锯齿状,频繁 GC
结果是产生内存碎片,内存碎片也是被视为可用内存,但是由于不连续的内存片段导致可以分配的连续内存空间变少,严重情况会导致 OOM。
//每隔20ms去创建一个 String 数组,这样会频繁的创建对象,回收对象,导致内存抖动
new Handler().postDelay(new Runnable(){
String[] value = new String[100000];
postDelay...
},20)
}
内存泄露
内存泄露是本该被回收的对象没有被回收,导致可用内存在减少
表现为内存抖动,可用内存减少
导致频繁 GC,严重情况会导致 OOM
Activity 中如果直接 new Handler() 做延迟操作,如果此时页面关闭之前 Handler 的任务还没执行完毕,那么就会有内存泄露的情况。
内存溢出
可用内存不足,导致 OOM,对于上面提到的内存抖动,内存泄露会可能引起内存溢出。
//内存溢出的栗子
while(true){
arrayList.add(new Object);
}
内存优化相关的工具介绍
Memory Profiler
这是 AS 自带的一个工具,它的好处如下:
- 实时图表示当前应用的内存使用量
- 识别内存泄露,内存抖动
如果实时图中显示内存不断的在飙升,那么就有可能是内存泄露。
- 提供堆转储的功能,强制 GC 及跟踪内存分配情况
如果实时图频繁出现锯齿状,那么就有可能出现内存抖动。
Memory Analyzer(MAT)
MAT 是一个强大的 heap 分析工具,主要用于分析内存泄露
和内存占用
LeakCanary
相比 Memory Profile 和 MAT 来说,LeakCanary 是一个自动化
内存泄露检测工具。
总结
在本文只是对内存优化做了简单地总结,没有使用实际的栗子来验证,在接下来的博客中我再来总结。
本文是笔者学习之后的总结,方便日后查看学习,有任何不对的地方请指正。
记录于 2019年4月22号