调取内存妙方法,轻松优化安卓应用程序
2023-10-02 19:59:32
本身运行的一个独立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的内存使用, 我们可以使用一些特定的方法:
-
使用trimMemory来获得系统内存回收的警告, 这表明当前内存吃紧, App可以根据系统情况释放自己的内容来保证当前的内存可用.
-
控制被回收的对象数目, 也就是所谓的对象池模式, 尽可能将经常使用, 但不需要独立保存的数据对象进行统一管理, 不要随意创建新的对象.
-
使用Statemanager来保存/恢复数据的对象, 尽量使用静态变量来保存不需要随着App状态改变而清除的数据.
-
可以通过debug.getMemoryInfo来获取当前app的内存使用情况.
-
尽量减少WakeLock的使用, WakeLock会一直占用cpu, 使得app不能进入到In Use状态,从而无法释放掉内存.
-
尽量少的使用Singleton模式, 过度使用Singleton, 所有的Singleton实例都会占用内存, 在onTrimMemory时, 这些实例并不会被清除, 也会一直占用内存,不利于App内存管理.
-
善于使用回收视图, 避免创建过多视图导致内存泄漏.
-
减少Handler的使用,过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降, 所以要善于使用Handler并及时移除不必要的Handler.
-
少用静态变量, 少使用单例对象
-
需要留意线程的使用, 尽量减少线程的数目, 并合理释放线程, 避免内存泄漏.
-
避免频繁新建对象, 减少内存分配次数, 使用对象池管理某些不可复用的对象.
-
尽量避免使用匿名内部类, 匿名内部类会持有外部类的引用, 容易产生内存泄漏.
-
尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.
-
留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.
-
尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.
-
尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.
-
避免使用过多的Handler, 过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降.
-
避免使用过多的单例对象, 过多的单例对象会占用内存, 也会导致GC频繁运行, 导致性能下降.
-
避免使用过多的匿名内部类, 过多的匿名内部类会持有外部类的引用, 容易产生内存泄漏.
-
尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.
-
留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.
-
尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.
-
尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.
-
避免使用过多的Handler, 过多的Handler会造成过多的内存分配, 会导致GC频繁运行, 导致性能下降.
-
避免使用过多的单例对象, 过多的单例对象会占用内存, 也会导致GC频繁运行, 导致性能下降.
-
避免使用过多的匿名内部类, 过多的匿名内部类会持有外部类的引用, 容易产生内存泄漏.
-
尽量使用局部变量, 避免使用成员变量, 成员变量会一直占用内存, 即使不使用也会.
-
留意全局变量的使用, 全局变量会一直占用内存, 即使不使用也会.
-
尽量避免使用静态变量, 静态变量会一直占用内存, 即使不使用也会.
-
尽量减少使用线程, 过多的线程会占用内存, 也会导致GC频繁运行, 导致性能下降.