17.1 避免可控的内存泄漏
17.1.1 什么是内存泄漏
每个应用程序都需要内存来完成工作,为了确保Android系统的每个应用都有足够的内存,Android系统需要有效地管理内存分配。当内存不足时,Android运行时就会触发GC,GC采用的垃圾标记算法为根搜索算法。
内存泄漏就是指没有用的对象到GC Roots 是可达的(对象被引用),导致GC无法回收该对象。
17.1.2 内存泄漏的场景
- 非静态内部类的静态实例
- 非静态内部类会持有外部类实例的引用,如果非静态内部类的实例是静态的,就会间接地长期维持着外部类的引用,阻止被系统回收。
- 多线程相关的匿名内部类/非静态内部类
- Handler内存泄漏
- 未正确使用Context
- 静态View
- WebView
- 资源对象未关闭
- 集合中对象没清理
- Bitmap对象
- 监听器未关闭
17.2 Memory Monitor
17.2.1 使用Memory Monitor
17.2.2 大内存申请与GC
17.2.3 内存抖动
内存抖动一般指在很短的时间内发生了多次内存分配和释放,严重的内存抖动还会导致应用程序卡顿。内存抖动出现的原因主要是短时间频繁地创建对象(可能在循环中创建对象),内存为了应对这种情况,也会频繁地进行GC。非并行GC在进行时,其他线程都会被挂起,等待GC操作完成后恢复工作。如果是频繁的GC就会产生大量的暂停时间,这会导致界面绘制时间减少,从而使得多次绘制一帧的时长超过了16ms, 产生的现象就是界面卡顿。综合起来就产生了内存抖动,产生了锯齿状的
抖动图。