Android避免OOM(内存溢出)需综合考虑内存管理、资源优化及编码规范,以下为具体方案:
1. 图像资源优化
- 使用适当采样率加载大图:通过`BitmapFactory.Options.inSampleSize`降低分辨率,避免直接加载原图。推荐结合`inJustDecodeBounds`预读尺寸后计算合适缩放比例。
- 选择高效格式:优先使用`WebP`替代`PNG/JPG`,减少内存占用。
- 及时回收资源:在`onDestroy`或页面不可见时调用`Bitmap.recycle()`,结合弱引用/软引用缓存。
2. 内存缓存策略
- 采用多级缓存架构:`LruCache`(内存缓存)+ `DiskLruCache`(磁盘缓存),严格限制内存缓存大小(建议设为最大堆的1/8)。
- 使用`Glide`或`Picasso`等成熟库:其内置自动内存管理、图片生命周期绑定及自适应解码策略。
3. 数据结构与对象池
- 避免高频创建对象:利用`ObjectPool`复用对象(如`Message.obtain()`),减少GC频率。
- 优先选择`SparseArray`替代`HashMap`:键为整型时节省30%内存。
4. Activity泄漏防治
- 防止静态引用:避免Activity被静态变量或单例长期持有,通过`WeakReference`传递上下文。
- 注销:在`onDestroy`中解除广播、回调等注册,防止隐式持有。
5. 内存监控与分析
- 使用Android Profiler:实时监控堆内存、内存分配及泄漏对象。
- 启用`LeakCanary`:自动检测内存泄漏并提供引用链分析。
- 关注`onTrimMemory()`回调:根据`TRIM_MEMORY_*`等级释放非关键资源。
6. 线程与进程优化
- 限制线程数:使用线程池(如`ThreadPoolExecutor`)避免无节制创建线程。
- 隔离耗时服务:将后台任务移至独立进程,通过`android:process`声明,隔离主进程内存压力。
7. 代码规范与反模式
- 避免在循环内创建对象:如字符串拼接优先使用`StringBuilder`。
- 谨慎使用枚举:单个枚举类比静态常量多占用约1.4倍内存,可用`@IntDef`替代。
8. 系统级配置
- 适配大内存设备:在`AndroidManifest.xml`中添加`
- Native内存管理:JNI层需手动释放native内存,避免Native Heap泄漏影响Java堆。
扩展知识:
Android内存模型:Java堆受限于设备最大堆大小(`Runtime.getRuntime().maxMemory()`),而Native堆理论上无硬性限制,但超出系统阈值仍会触发OOM。
低内存设备适配:针对512MB以下内存设备,需进一步压缩资源,如采用矢量图替代位图,动态加载模块化资源。
通过上述方法系统性优化,可显著降低OOM风险,但需结合实际场景权衡性能与内存占用。