1、什么是OOM?
程序申请内存过大,虚拟机无法满足我们,然后自杀了。这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候。通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认为我们的程序需要的内存过大,及时系统有充分的内存,比如1G,但是系统也不会分配给我们的APP,故而抛出OOM异常,程序没有捕捉异常,故而弹窗崩溃了
2、为什么会有OOM?
因为Android系统的APP每个进程或者虚拟机有最大内存限制,一旦超过这个限制系统就会抛出OOM错误。跟手机剩余内存是否充足没有多少关系。
3、为什么Android会有APP的内存限制
(1)要开发者使用内存更加合理。限制每个应用可用内存上限,避免恶意程序或单个程序使用过多内存导致其他程序的不可运行。有了限制,开发者就必须合理使用资源,优化资源使用
(2)屏幕显示内容有限,内存足够即可。即使有万千图片千万数据需要使用到,但在特定时刻需要展示给用户看的总是有限的,因为屏幕显示就那么大,上面可以放的信息就是很有限的。大部分信息都是处于准备显示状态,所以没必要给予太多heap内存。必须一个ListView显示图片,打个比方这个ListView含有500个item,但是屏幕显示最多有10调item显示,其余数据是处于准备显示状态。
(3)Android多个虚拟机Davlik的限制需要。android设备上的APP运行,每打开一个应用就会打开至少一个独立虚拟机。这样可以避免系统崩溃,但代价是浪费更多内存。
4、有GC自动回收资源,为什么还会有OOM?
Android的GC会按照特定的算法来回收不使用的资源,但是gc一般回收的是无主的对象内存或者软引用资源。
使用软引用的图片资源在一定程度上可以避免OOM。
ps:不用的对象设置为null,是一个好习惯。不过更好的方法是,不用的图片直接recycle。因为有时候通过设置null让gc来回收还是来不及。
5、怎么来避免OOM产生呢?
简单通过SoftReference引用方式管理图片资源
建一个SoftReference的hashmap,使用图片时,先检查这个hashmap是否有softreference,softreference的图片是否为空,如果为空将图片加载到softreference并加入haspmap。
代码如下:

作者:GB_speak
链接:https://www.jianshu.com/p/41ffbf31b20c
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最新文章

  1. Eclipse Android环境搭建
  2. EventBus完全解析--组件/线程间通信利器
  3. css3属性之 box-sizing
  4. IE10 CSS hack,IE兼容问题
  5. android:process为耗资源操作指定一个新进程
  6. ETL构建数据仓库五步法
  7. 洛谷 P1273 有线电视网(dp)
  8. nodejs 模拟form表单上传文件
  9. web浏览器上传超大文件插件
  10. 20165318 预备作业二 学习基础和C语言基础调查
  11. Leetcode 2——Range Sum Query - Mutable(树状数组实现)
  12. 第二篇:利用shell脚本执行webservice请求——基于soap
  13. mysql 删除所有表
  14. Java基础语法入门
  15. Run Redis
  16. Nginx 磁盘IO的优化
  17. MATLAB矩阵的LU分解及在解线性方程组中的应用
  18. Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
  19. Haskell语言学习笔记(63)Dicidable
  20. JSP复习(part 3 )

热门文章

  1. 《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?
  2. 巨蟒python全栈开发django6: FBV&CBV&&单表查询的其他方法
  3. 学习 SSH
  4. 深入理解javascript原型和闭包(17)——补充:上下文环境和作用域的关系
  5. mock数据(模拟后台数据)
  6. Linux中的history命令
  7. Python lxml 使用
  8. LVC函数重要参数 EDT_CLL_CB:退出可编辑单元格时回调
  9. 20170411 F110初始界面-建议清单
  10. ssh 的用法