重学Android之OOM优化

本文探讨了Android中的OOM问题,分析了多种引发OOM的原因,包括静态Context、Bitmap未及时回收、线程数超限、文件描述符过多、Cursor未关闭、Java堆内存超限等。并提出了解决方案,如使用Android Studio的分析工具,优化数据结构如ArrayMap/SparseArray,减少Bitmap内存占用,避免在onDraw中创建对象,以及注意缓存对象的泄漏等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分析工具


OOM发生以后,使用Android Studio 自带的Android Monitor dump出HPROF文件,然后使用SDK中的hprof-conv(位于sdk_root/platform-tools)工具转换为标准的Java堆转储文件格式,这样就可以使用MAT继续分析

Android OOM类型:


  1. 使用static修饰Context变量,Context被Hold住了导致Activity无法销毁
  2. Bitmap没有及时回收,调用recycle()函数并不能立即释放Bitmap,读取Bitmap到内存的时候没有做采样率的设置;
if(bitmap != null && !bitmap.isRecycled()){

// 回收并且置为null

bitmap.recycle();

bitmap = null;

}

System.gc();

  1. 线程数超限,proc/pid/status中记录的线程数超过proc/sys/kernel/threads-max中规定的最大线程数,比如随意创建线程,没有使用线程池来管理
  2. 文件描述符(fd)超限,proc/pid/fd 下文件数目超过proc/pid/limits中的限制,场景如大量的Socket请求或者文件打开操作
  3. Cursor使用问题,使用完之后没有及时关闭
  4. Java堆内存超限,申请的堆内存超过Runtime.getRuntime().maxMemory().

栈内存用来存储局部变量和方法调用,栈内存的线程是私有的&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值