返回

调取内存妙方法,轻松优化安卓应用程序

Android

本身运行的一个独立VM, 都有自己的内存堆, 由GC负责内存管理.

那么, 接下来我们开始进入今天的主体内容, Android是如何管理App内存的, 或者说是以什么样的机制管理App的内存.

首先我们要了解, Android的每一个App, 或者说, 每一个VM, 都会处于不同的四个状态:

  • In Use: App处于使用中, 如果App进入后台一段时间, 在前台仍然能看到, 属于这种情况
  • Active: App在前台运行, 有和用户交互, 正执行App的代码
  • Top Active: App处于最上层, 在屏幕上可以看到
  • Inactive: App处于后台, 不能和用户交互

如果一个App的状态从Active到Top Active, 或从Inactive到Active, 会优先分配内存.

而在Active到Inactive状态转换时, 会清除不需要的数据. 而在Active到In Use状态转换时, 会清除所有的内容, 在需要时重新恢复.

那么为了进一步的优化App的内存使用, 我们可以使用一些特定的方法:

  1. 使用trimMemory来获得系统内存回收的警告, 这表明当前内存吃紧, App可以根据系统情况释放自己的内容来保证当前的内存可用.

  2. 控制被回收的对象数目, 也就是所谓的对象池模式, 尽可能将经常使用, 但不需要独立保存的数据对象进行统一管理, 不要随意创建新的对象.

  3. 使用Statemanager来保存/恢复数据的对象, 尽量使用静态变量来保存不需要随着App状态改变而清除的数据.

  4. 可以通过debug.getMemoryInfo来获取当前app的内存使用情况.

  5. 尽量减少WakeLock的使用, WakeLock会一直占用cpu, 使得app不能进入到In Use状态,从而无法释放掉内存.

  6. 尽量少的使用Singleton模式, 过度使用Singleton, 所有的Singleton实例都会占用内存, 在onTrimMemory时, 这些实例并不会被清除, 也会一直占用内存,不利于App内存管理.

  7. 善于使用回收视图, 避免创建过多视图导致内存泄漏.

  8. 减少Handler的使用,过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降, 所以要善于使用Handler并及时移除不必要的Handler.

  9. 少用静态变量, 少使用单例对象

  10. 需要留意线程的使用, 尽量减少线程的数目, 并合理释放线程, 避免内存泄漏.

  11. 避免频繁新建对象, 减少内存分配次数, 使用对象池管理某些不可复用的对象.

  12. 尽量避免使用匿名内部类, 匿名内部类会持有外部类的引用, 容易产生内存泄漏.

  13. 尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.

  14. 留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.

  15. 尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.

  16. 尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.

  17. 避免使用过多的Handler, 过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降.

  18. 避免使用过多的单例对象, 过多的单例对象会占用内存, 也会导致GC频繁运行, 导致性能下降.

  19. 避免使用过多的匿名内部类, 过多的匿名内部类会持有外部类的引用, 容易产生内存泄漏.

  20. 尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.

  21. 留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.

  22. 尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.

  23. 尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.

  24. 避免使用过多的Handler, 过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降.

  25. 避免使用过多的单例对象, 过多的单例对象会占用内存, 也会导致GC频繁运行, 导致性能下降.

  26. 避免使用过多的匿名内部类, 过多的匿名内部类会持有外部类的引用, 容易产生内存泄漏.

  27. 尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.

  28. 留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.

  29. 尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.

  30. 尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.