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

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.lryc.cn/news/614578.html

相关文章:

  • K-Means 聚类
  • 嵌入式第二十三课 !!!树结构与排序(时间复杂度)
  • AD布线时,如何设置线宽和线间距?简单
  • OpenAI 时隔多年再开源!GPT-OSS 120B/20B 发布,支持本地部署,消费级 GPU 即可运行
  • 五十六、【Linux系统nginx服务】nginx虚拟主机实现
  • InfluxDB 权限管理与安全加固(一)
  • leetcode热题——有效的括号
  • 安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击
  • C++AVL树
  • windows自动获取wsl IP,并开启端口转发。
  • 供应链项目中产品的ABC XYZ分类法弊端(十)
  • 常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 RPC
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 【0基础3ds Max】主工具栏介绍(上)
  • [链表]142. 环形链表 II
  • Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害数值模拟与预警中的应用(388)
  • 大模型性能测试实战指南:从原理到落地的全链路解析
  • 【Day 19】Linux-网站操作
  • 小程序难调的组件
  • Vite 深度解析:现代前端开发引擎
  • AI 记忆管理系统:工程实现设计方案
  • Introducing Visual Perception Token into Multimodal Large Language Model论文解读
  • 脚本统计MongoDB集合结构信息
  • 关于数据结构6-哈希表和5种排序算法
  • WSL安装MuJoco报错——FatalError: gladLoadGL error
  • Vue框架总结案例
  • HTML <picture> 元素:让图片根据设备 “智能切换” 的响应式方案
  • OpenAI 开源 GPT-OSS:1200亿参数推理模型上线,完全免费、商用可用,全民可控智能体时代正式开启!
  • 《前端60问:从设备判断到性能优化全解》
  • PeiQi网络安全知识文库PeiQi-WIKI-Book保姆式搭建部署教程