17 内存优化

2019/03/27 posted in  Android进阶解密

17.1 避免可控的内存泄漏

17.1.1 什么是内存泄漏

每个应用程序都需要内存来完成工作,为了确保Android系统的每个应用都有足够的内存,Android系统需要有效地管理内存分配。当内存不足时,Android运行时就会触发GC,GC采用的垃圾标记算法为根搜索算法。

内存泄漏就是指没有用的对象到GC Roots 是可达的(对象被引用),导致GC无法回收该对象。

17.1.2 内存泄漏的场景

  1. 非静态内部类的静态实例
    1. 非静态内部类会持有外部类实例的引用,如果非静态内部类的实例是静态的,就会间接地长期维持着外部类的引用,阻止被系统回收。
  2. 多线程相关的匿名内部类/非静态内部类
  3. Handler内存泄漏
  4. 未正确使用Context
  5. 静态View
  6. WebView
  7. 资源对象未关闭
  8. 集合中对象没清理
  9. Bitmap对象
  10. 监听器未关闭

17.2 Memory Monitor

17.2.1 使用Memory Monitor

17.2.2 大内存申请与GC

17.2.3 内存抖动

内存抖动一般指在很短的时间内发生了多次内存分配和释放,严重的内存抖动还会导致应用程序卡顿。内存抖动出现的原因主要是短时间频繁地创建对象(可能在循环中创建对象),内存为了应对这种情况,也会频繁地进行GC。非并行GC在进行时,其他线程都会被挂起,等待GC操作完成后恢复工作。如果是频繁的GC就会产生大量的暂停时间,这会导致界面绘制时间减少,从而使得多次绘制一帧的时长超过了16ms, 产生的现象就是界面卡顿。综合起来就产生了内存抖动,产生了锯齿状的
抖动图。

17.3 Allocation Tracker

17.3.1 使用Allocation Tracker

17.3.2 alloc文件分析

17.4 Heap Dump

17.4.1 使用Heap Dump

17.4.2 检测内存泄漏

17.5 内存分析工具MAT

17.5.1 生成hprof文件

17.5.2 MAT分析hprof文件

17.6 LeakCanary

17.6.1 使用LeakCanary

17.6.2 LeakCanary应用举例

17.7 本章小结