在Android中,一个Process 只能使用16M内存,要是超过了这个限定就会跳出这个异常。 
那么,开发中,有哪些措施能避免这个问题呢?不仅仅是Bitmap的处理,其他方面也会导致OOM。有哪些好的内存优化方式呢?
添加评论 分享
按投票排序按时间排序

11 个回答

赞同28 反对,不会显示你的姓名

Billy Cui,对Android总体开发和架构一知半解

darkhorse pxf、空空、李弄 等人赞同

对于OOM,其实最重要的是注意不要Memory Leak。而Memory Leak是会有多个方面会引起的,比如Drawable, RemoteViews, Receiver, Cursor,InputStream, MediaPlayer等,此外,如果使用JNI也会因为C或C++的代码导致Memory Leak。

除了Memory Leak,大数据量的操作也会导致OOM,比如之前其他回答提到的Bitmap,还有ListAdapter,如果在getView时处理不当,也很容易导致OOM,所以在ListAdapter时应该尽量使用convertView。

最后,可以用android.os.StrictMode以及Eclipse的MAT工具来进行OOM和Memory Leak的检测。

发布于 2011-11-10 添加评论         

赞同18 反对,不会显示你的姓名

朱磊,沉浸在移动互联网的浪潮中.

于淼、小潇、葛艺潇 等人赞同

我的做法是时间换空间,尽量文件化一些占用内存的数据。最典型的就是ListView中的Bitmap,可以参考这个开源组件的实现。http://code.google.com/p/android-imagedownloader/ 其将Bitmap都本地文件缓存,内存中只保留最近使用的4张图片,在使用中发现还是会偶尔出现OOM,然后我就将其改为完全的读取文件,内存中不保留图片,使用以后都自动回收,由此扩展的数据文件也同样缓存成文件。

除了Bitmap,其他的地方没想到什么能占用这么大内存,网络下载下来的数据文件?需要都留在内存中吗?目前我做的应用,每次请求的数据大小都比较小,每次Http请求下来的数据都把url转换成文件名,然后缓存成文件,在下次Http请求的时候先根据url来预读文件,暂时不用的数据就释放掉。

经常会OOM我觉得就是在Bitmap处理的时候,比如decodeFile,在往界面上加载图片时,不用直接加载原图,可以进行缩放。一张1000*1000的图片要加载到一个100*100的ImageView上,直接加载进来大多数都会OOM,可以先用inJustDecodeBounds 
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
拿到这个图片的大小,再算好缩放比例
int scale = 0;
scale = (int)(options.outHeight / (float)size);
if (scale <= 0) {
scale = 1;
}
options.inSampleSize = scale;
options.inJustDecodeBounds = false;
再进行decode。

总之就是尽量时间换空间,实际这个时间是非常非常短的,用户体验内的。

编辑于 2011-11-07 7 条评论         

赞同4 反对,不会显示你的姓名

Xu Huang

李弄、知乎用户、叶风 等人赞同

自己用的两个方法
1.手动管理activty栈 即跳转时 finish 上一个activity
这样可以省很大內存
2.野路子 将内存的使用转移到 c层 通过使用jni malloc获得的内存是没有16m限制的 我在samsung 2g内存的手机上 最大可以申请到1.5GB内存
ps:知乎的oom真他妈的太严重了 好伤......
编辑于 2013-09-17 2 条评论         

赞同3 反对,不会显示你的姓名

wangpan,Android开发 / 产品设计

李弄、知乎用户、贺健波 赞同

我写过一篇博客《Android内存溢出分析》,记录了之前解决 淘身边 内存益处问题时用到的方法。
编辑于 2013-12-05 添加评论         

赞同2 反对,不会显示你的姓名

姜家志,职业码农

田阿壶、王宏伟 赞同

谷歌那让人“呵呵”的图像技术,设置inPurgeable选项为true,当系统需要回收内存时,会清理Bitmap对象所占据的内存。这样,如果需要再次访问Bitmap对象,则需要re-decode。因为re-decode需要保持对源(InputStream或ByteArray)的引用,所以,inPurgeable不能用于decodeResource和decodeFile
发布于 2014-10-09 添加评论         

赞同0 反对,不会显示你的姓名

刘彧,1个月android程序开发经验

对于图片要注意recycle吧,分辨率大的图片也要使用BitmapFactory.decode来降低分辨率,减少内存占用,资源图片也要注意不要使用太大的图片
发布于 2011-11-03 1 条评论         

赞同0 反对,不会显示你的姓名

李昊

网络上很多相关内容,但是没有统一的解决方案
最后都会说
1.recycle所有对象,排除程序对该对象的引用,然后System.gc(),但有时候不能根本的解决问题,因为android内部的对内存的限制机制导致的
2.bitmap是在我开发过程中,oom最多的地方,最后结论是,只能大幅度的缩小图片比例
发布于 2011-11-11 添加评论         

赞同0 反对,不会显示你的姓名

黄杲,智能手机设计行业从业者

可以用MAT来检查内存泄露,或者用Monkey Test也能够帮助发现应用的内存泄露。
但内存使用的优化就看工程师的功力了。
发布于 2011-11-15 添加评论         

赞同0 反对,不会显示你的姓名

知乎用户,荡漾的安卓开发者,好游戏,好编程,好女色

V4包里有很好用的cache你也可以用guava库来实现cache功能。虚拟机垃圾回收有它自己的一套规则你可以参考相关的资料。bitmap的压缩你可以通过屏幕的实际宽高来适配
发布于 2014-03-28 添加评论         

赞同1 反对,不会显示你的姓名

邓桥,1号店武汉资深开发工程师

李弄 赞同

图片销毁一定要recycle,尽量使用SoftReference,网上可以找到资料。
发布于 2011-11-10 2 条评论         

赞同0 反对,不会显示你的姓名

刘沛,专业回答技术问题。

使用泛型算法或者泛型容器多多少少都会引起Memory Leak,在现代面向对象编程中似乎Memory Leak已经无法避免了,总之能自己写的算法就不要用泛型。

在Android开发中,有哪些好的内存优化方式?如何避免 Out Of Memory(OOM) ?相关推荐

  1. Android开发中配置JDK环境的几种方式

    文章目录 一.前言 二.IDE设置 三.环境变量 四.gradle中配置 五.参考链接 一.前言 在Android开发中,配置JDK环境有以下几种方式来是Android项目正常编译 - changin ...

  2. 在Android开发中不要再用new Thread的方式开启线程啦

    正如标题所言,如果直接使用new Thread的方法创建一个线程,很大概率就会导致内存泄漏.因为一个内部类始终会持有外部类的引用,如果这个内部类恰好是一个Thread对象,它拿着外部类的引用跑在另一个 ...

  3. 【Android开发学习笔记之一】5大布局方式详解

    Android中常用的5大布局方式有以下几种: 线性布局(LinearLayout):按照垂直或者水平方向布局的组件. 帧布局(FrameLayout):组件从屏幕左上方布局组件. 表格布局(Tabl ...

  4. Android开发中应避免的重大错误

    by Varun Barad 由Varun Barad Android开发中应避免的重大错误 (Critical mistakes to avoid in Android development) A ...

  5. android 4.4 禁止下拉,Android开发中禁止下拉式的实现技巧

    我们开发项目的时候,经常会看到禁止的情况,而Android开发中并没有直接调用的接口,下面是爱站技术频道小编就给大家介绍的Android开发中禁止下拉式的实现技巧,希望网友们喜欢! 分享给大家供大家参 ...

  6. 史上最全Android开发中100%会用到的开源框架整理(1/5)

    其实这个开源框架整理很久了,只是一直放在有道云笔记里面,笔者还有很多写得文章都放在有道云笔记里面,有时间都好好整理一下放出来,本篇文章也会不定期更新,由于整理的开源框架分类都有200多个,所有这次只将 ...

  7. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  8. 5 个 Android 开发中比较常见的内存泄漏问题及解决办法

    Android开发中,内存泄漏是比较常见的问题,有过一些Android编程经历的童鞋应该都遇到过,但为什么会出现内存泄漏呢?内存泄漏又有什么影响呢? 在Android程序开发中,当一个对象已经不需要再 ...

  9. Android开发中的Handler和多线程

    在Android开发中我们常常用到Handler这个类去处理消息队列中的消息,以下这个例子实现的是利用Handler传递一个消息给线程,线程运行run()方法去更新进度条的进度,以下是源代码: pub ...

  10. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

最新文章

  1. 找出前50个素数,构成素数表
  2. Android TTS实现简单阅读器
  3. python常用代码入门-最全Python算法实现资源汇总!
  4. MYSQL 远程访问被限制
  5. Unity 3D | 在Unity3D中创建/执行C#脚本
  6. python培训 首选马哥教育
  7. 小说app开发—小说app搭建需要注意什么问题?
  8. 西安大略电子与计算机工程专业,2020年西安大略大学电子与计算机工程(工程科学硕士, 工程硕士)专业硕士申请条件-学费-世界排名...
  9. Java多线程的简介
  10. Javascript复习必记知识点
  11. android支付宝转跳转,APP跳转支付宝指定界面
  12. CSS中的四种定位以及top和margin-top的区别
  13. 苹果换原装电池_苹果手机换电池客户必看!苹果原装电池科普鉴别!
  14. bandizip没有右键菜单解决办法
  15. 实验三 mysql数据库与表的创建_实验二 数据库和表的创建与管理
  16. Erlang和Elixir,第5部分:Phoenix框架
  17. HTML中禁止自动完成和禁用输入法
  18. 什么是机器学习?简单理解
  19. parsec使用教程
  20. 数据分析——用户流失分析

热门文章

  1. 【C++ 语言】面向对象 ( 成员函数 | 常量函数 | 友元函数 | 友元类 | 单例类 )
  2. C++ Primer 第9章 顺序容器 第一次学习笔记
  3. JNI中java类型的简写
  4. intelliJ idea 下载安装
  5. (HDU)1056 --HangOver( 悬住)
  6. SQL server与Oracle触发器的创建与使用
  7. Codeforces 167B Wizards and Huge Prize(概率dp)
  8. C++ 继承和派生 及 学生管理范例
  9. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点
  10. innerHTML的确是好东西