如何避免OOM产生

OOM的产生

  • 已使用内存+新申请内存>可分配内存
  • OOM几乎覆盖所有的内存区域,通常指堆内存
  • Native Heap在物理内存不够时也会抛出OOM

使用合适的数据结构

  • HashMap——大于1000个数、增删频繁
  • ArrayMap——key不是整型
  • SparseArray——Key是整型(池化技术、内存复用)

避免使用枚举

每一个枚举就是一个对象,对象至少占24字节。所以使用静态常量:

1
2
3
4
5
6
7
@Retention(value = RetentionPolicy.SOURCE)
@IntDef(value = {COMMON, LOAD_MORE, LOAD_REFRESH})
public @interface LoadType {}

public static final int COMMON = 0;
public static final int LOAD_MORE = 1;
public static final int LOAD_REFRESH = 2;

Kotlin 可以使用内联类,编译时转化为int,节省内存。

Bitmap

  • 尽量根据实际需求选择合适的分辨率

  • 不用帧动画,使用代码实现动效

  • 使用Bitmap重采用和复用配置

    使用NDK

  • Native Heap没有专门的使用限制

  • 内存大户的核心逻辑主要在Native 层

内存优化5R法则

  • Reduce缩减:降低图片分辨率/重采样/抽稀策略
  • Reuse复用:池化策略/避免频繁创建对象,减小GC压力
  • Recycle回收:主动销毁、结束,避免内存泄露/生命周期闭环
  • Refactor重构:更合适的数据结构/更合理的程序架构
  • Revalue重审:谨慎使用Large Heap/多进程/第三方框架