什么是OOM?

当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out Of Memory异常。

一些容易混淆的概念:

  • 内存溢出:指的就是OOM。
  • 内存抖动:是短时间内大量的对象被创建,然后又被马上释放这些顺间所产生对象,会严重点用内存区【最近刚分配的对象会放在Young Generation区域】,由于刚创建的对象又快速被释放这样就会对堆内存的压力从而触发更多的GC。
  • 内存泄漏:这个是开发中比较常见的,指的是进程中的某些对象已经没有其它对象引用它了,但是它又能直接或间接的引用GC ROOT,也就是还能引用到没有被回收的对象,导至GC无法产生作用,当内存泄漏累积到一定程度就会引发OOM。

如何解决OOM:

  • 有关bitmap:
    ①、图片的显示:在ListView中加载大图时去做滑动监听,只有是停止状态才去网络加载图片。
    ②、及时释放内存:因为一个图片存在两部分内存:一是java层的内存,二是C层的内存,而C层的内存是不会被JVM所回收的,所以需要及时去调用recycle()方法对底层的内存进行释放,另外需要注意:并非不掉用recycle()方法就容易造成内存溢出,因为当app被杀掉之后C层的也会主动被释放的。
    ③、图片的压缩:insamplesize。
    ④、inBitmap属性:3.0系统以后才支持它,主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。inBitmap类似对象池的技术原理,避免内存的频繁的创建和销毁带来性能的损耗。使用inBitmap能高提升bitmap的循环效率。在Google发布的第二季性能优化都有提到inBitmap技术
使用inBitmap前,每创建一个bitmap需要独占一块内存:

    使用inBitmap后,多个bitmap会复用同一块内存

    所以使用inBitmap能够大大提高内存的利用效率,但是它也有几个限制条件:
    1. 在SDK 11 -> 18之间,重用的bitmap大小必须是一致的,例如给inBitmap赋值的图片大小为100-100,那么新申请的bitmap必须也为100-100才能够被重用。从SDK 19开始,新申请的bitmap大小必须小于或者等于已经赋值过的bitmap大小。
    2. 新申请的bitmap与旧的bitmap必须有相同的解码格式,例如大家都是8888的,如果前面的bitmap是8888,那么就不能支持4444与565格式的bitmap了,不过可以通过创建一个包含多种典型可重用bitmap的对象池,这样后续的bitmap创建都能够找到合适的“模板”去进行重用。
    博客参考:http://blog.csdn.net/zjd934784273/article/details/54670064

    ⑤、捕获异常。避免实例化Bitmap时因内存不足抛异常。

  • 其它方法:
    ①、listView优化:convertView / LRU。
    ②、避免在onDraw()方法里面执行对象的创建。因为跟之前内存抖动的情况类似,因为可能存在大量临时对象又迅速被回收,而内存抖动多了最终也会引起OOM。
    ③、谨慎使用多进程:这是官方给出的优化,如果APP的业务木有达到一定的程序尽量少用多进程,因为多进程的代码处理会更加复杂,很容易造成莫名的crash。

Android异常与性能优化相关面试问题-OOM异常面试问题详解的更多相关文章

  1. Android异常与性能优化相关面试问题-内存管理面试问题详解

    内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...

  2. Android异常与性能优化相关面试问题-ui卡顿面试问题详解

    UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...

  3. Android异常与性能优化相关面试问题-其他优化面试问题详解

    Android不用静态变量存储数据: 静态变量等数据由于进程已经被杀死而被初始化.在Android中应用进程不是安全的,因为它会有系统给kill掉,但是在实际中可能会有这样的一个假象:当app被杀掉之 ...

  4. Android异常与性能优化相关面试问题-冷启动优化面试问题详解

    什么是冷启动: 冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息.实际也就是要执行Application.onCreate()方法的那次启动. 冷启动 / 热启动的区别:热启动:用 ...

  5. Android异常与性能优化相关面试问题-内存泄漏面试问题讲解

    Java内存泄漏基础知识: Java的内存的分配策略 a.静态存储区:也叫方法区,主要是存放一些静态数据及全局变量等,在程序编译时就已经分配好了,并且在静态存储区中存放的变量在整个程序运行期间都存在. ...

  6. Android异常与性能优化相关面试问题-ANR异常面试问题详解

    什么是ANR? Application Not Responding 造成ANR的主要原因: 应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当监视到在A ...

  7. Android异常与性能优化相关面试问题-bitmap面试问题详解

    recycle: 对于Bitmap来说内存分为Java内存和Native内存,而当图片不用时建议调用一下recycle()方法来将native层的内存进行回收,下面看一下它的源码官方对它的解释: LR ...

  8. 转——Android应用开发性能优化完全分析

    [工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...

  9. Android 应用开发性能优化完全分析

    1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...

随机推荐

  1. Servlet 使Session设置失效

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletExcep ...

  2. visio给任意图形进行填充

    使用visio给图形填充颜色的条件:图形必须是封闭的!!! 但是很多人不明白:我明明画的图形是封闭的啊!可是无法填充颜色!这是因为,你画了一个看上去是封闭的图形,但是VISIO认为你画的不是封闭图形! ...

  3. 精通Java中的volatile关键字

    在一些开源的框架的源码当中时不时都可以看到volatile这个关键字,最近特意学习一下volatile关键字的使用方法. 很多资料中是这样介绍volatile关键字的: volatile是轻量级的sy ...

  4. Oracle通过正则表达式分割字符串 REGEXP_SUBSTR

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(string, pattern, position, occurrence, modifier) string ...

  5. Python接口开发小知识

    关于数据库设计 接口开发多学习数据库表操作,这是要点 不存在删除数据,每个可能被删除数据的表加一个is_active属性 不同的表可以有多个相同的字段,字段属性少用禁止非空 不要设置太多主外键(高内聚 ...

  6. 利用requests提交相同名称数据的处理方法

    #字典键不能重复 data={ boardid' : boardid, 'divids[ ]' : '0' , 'divids[ ]' : '1' , 'divids[ ]' : '2' , } #这 ...

  7. 牛客 109B 好位置 (字符串水题)

    大意: 给定字符串$s1,s2$, 对于$s1$中所有与$s2$相等的子序列$t$, $t$在$s1$中的下标定义为好位置. 求$s1$是否所有位置都是好位置. 显然$s1$的前缀要与$s2$相等, ...

  8. [C#.net]使用Thread.Sleep界面卡死的问题解决方法

    很多初学者在写C#程序的时候,需要程序等待某个时间,但是又不想用比较繁琐的线程等操作,因此用Thread.Sleep()函数,但是这个函数在等待过程中会操作界面的卡死,那么,如何能保证既不卡死又能达到 ...

  9. join函数详解

    定义:join() 方法用于把数组中的所有元素放入一个字符串. 语法 : ArrayObject.join(separator)   separator 可选.指定要使用的分隔符.如果省略该参数,则使 ...

  10. 随便----js参考书

    一.Javascript方面的书籍: 1 JavaScript权威指南(第6版):号称javascript圣经,前端必备:前端程序员学习核心JavaScript语言和由Web浏览器定义的JavaScr ...