当前位置: 首页 > ds >正文

Android 之 OOM的产生和解决办法

  1. ​内存泄漏(Memory Leak)​

    • ​原因​​:对象因错误引用(如静态变量、未注销监听器、Handler 消息未清理)无法被垃圾回收(GC),导致内存持续占用

    • ​典型场景​​:

      • 静态变量持有 Activity引用。

      • Handler发送延迟消息后未移除,导致 Activity无法回收。

      • 未反注册 BroadcastReceiver或传感器监听。

  2. ​大对象滥用​

    • ​原因​​:

      • ​图片处理不当​​:加载未压缩的高分辨率 Bitmap(如 4K 图片占用 48MB 内存)。

      • ​频繁创建对象​​:循环中拼接字符串或创建临时集合,引发内存抖动。

  3. ​资源未释放​

    • ​原因​​:未关闭 Cursor、文件流、MediaPlayer等,占用系统资源(如文件描述符耗尽)。

  4. ​线程过多​

    • ​原因​​:无限制创建线程,超出系统限制(如低端设备线程数上限 500)。


🛠️ ​​解决方案​

1. ​​根治内存泄漏​
  • ​避免强引用​​:用 WeakReference替代静态变量持有 Activity

  • ​及时清理​​:在 onDestroy()中移除 Handler消息、反注册监听器。

  • ​工具检测​​:集成 LeakCanary自动捕获泄漏链。

2. ​​优化图片处理​
  • ​压缩采样​​:使用 BitmapFactory.Options.inSampleSize按需缩放图片。

  • ​低内存配置​​:设置 inPreferredConfig=RGB_565(内存减半)。

  • ​复用与回收​​:

    • 通过 inBitmap复用 Bitmap内存。

    • 调用 bitmap.recycle()及时释放。

  • ​推荐库​​:Glide/Picasso自动管理图片生命周期。

3. ​​控制内存占用​
  • ​缓存策略​​:使用 LruCache限制内存缓存大小(如堆内存的 1/8)。

  • ​对象池​​:复用频繁创建的对象(如 Message、自定义模型)。

  • ​数据结构优化​​:

    • SparseArray替代 HashMap<Integer, Object>

    • 分块处理大数组(如 1MB/块)。

4. ​​释放资源与线程管理​
  • ​关闭资源​​:在 finally块中关闭流、Cursor

  • ​线程池​​:用 ThreadPoolExecutor限制并发线程数,避免无限创建。

5. ​​架构级优化​
  • ​多进程拆分​​:将内存密集型模块(如相册、WebView)放入独立进程。

  • ​响应内存紧张​​:在 onTrimMemory()中释放非关键缓存。


💎 ​​总结​

OOM 的核心矛盾是 ​​有限内存 vs 无限需求​​。

  • ​优先解决内存泄漏​​(占 OOM 的 70%),辅以图片优化、资源释放。

  • ​预防>修复​​:开发阶段启用 StrictMode检测资源泄漏,线上监控 OOM 率

http://www.xdnf.cn/news/17456.html

相关文章:

  • openpnp - 不连接设备,只大概测试一下摄像头是否好使
  • 汉明码:从原理到实现的深度解析
  • (nice!!!)(LeetCode 每日一题) 808. 分汤 (深度优先搜索dfs)
  • Lattice Radiant 下载ROM以及逻辑分析仪调试
  • (数据结构)链表
  • 快切装置与备自投装置的区别
  • Node.js 》》数据验证 Joi 、express-joi
  • 汽车电子:现代汽车的“神经中枢“
  • 【优选算法】多源BFS
  • 三方相机问题分析七:【datespace导致GPU异常】facebook 黑块和Instagram花图问题
  • C++程序库选择:权衡与取舍的艺术——以iostream和stdio为例
  • 借助Rclone快速从阿里云OSS迁移到AWS S3
  • 使用 C# 通过 .NET 框架开发应用程序的安装与环境配置
  • 省市县人口密度(2000-2023)
  • 嵌入式 - 数据结构:哈希表和排序与查找算法
  • 基于Jeecgboot3.8.1的flowable流程审批人为空的设置-后端部分
  • 若以微服务部署踩坑点
  • 【C#】掌握并发利器:深入理解 .NET 中的 Task.WhenAll
  • 跟着尚硅谷学vue-day7
  • 【MongoDB学习笔记2】MongoDB的索引介绍
  • 宁商平台税务新政再升级:精准施策,共筑金融投资新生态
  • 塑料可回收物检测数据集-10,000 张图片 智能垃圾分类系统 环保回收自动化 智慧城市环卫管理 企业环保合规检测 教育环保宣传 供应链包装优化
  • UE5太空射击游戏入门(一):项目创建与飞船控制
  • 5.0.9 C# wpf通过WindowsFormsHost嵌入winform控件
  • 网络基础浅谈
  • 僵尸进程、孤儿进程、进程优先级、/proc 文件系统、CRC 与网络溢出问题处理(实战 + 原理)
  • Docker搭建Jenkins实现自动部署:快速高效的持续集成之道!
  • 进程管理、系统高负载、cpu超过800%等实战问题处理
  • Android 中解决 Button 按钮背景色设置无效的问题
  • Numpy科学计算与数据分析:Numpy广播机制入门与实践