什么是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. 爬虫学习笔记之为什么要设置超时时间,怎么设置(使用selenium)

    一个程序没有设置超时时间,就可以说是一段有缺陷的代码. 读取超时指的就是客户端等待服务器发送请求的时间.(特定地,它指的是客户端要等待服务器发送字节之间的时间.在 99.9% 的情况下这指的是服务器发 ...

  2. 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口

    JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...

  3. 关于安装Git后,项目目录右键菜单无Git Bash Here命令的选项

    修改注册表配置 1.第一步,window + R,输入regedit回车进入注册表 2.依次进入HKEY_CLASSES_ROOT --> Directory -->Background ...

  4. gzip压缩配置

    gzip on;gzip_buffers 32 4K;gzip_comp_level 6;gzip_min_length 200;gzip_types text/css text/xml applic ...

  5. Spring MVCD框架中调用HanLP分词的方法

    项目简要:关于java web的一个项目,用的Spring MVCd 框架.鉴于参与此次项目的人中并不是所人都做的Spring,为了能够提高效率,建议大家是先抛开SPring来写自己负责的模块,最后再 ...

  6. 【C++11应用】基于C++11及std::thread实现的线程池

    目录 基于C++11及std::thread实现的线程池 基于C++11及std::thread实现的线程池 线程池源码: #pragma once #include <functional&g ...

  7. 2019CSP-S游记

    \(2019CSP-S\)游记 \(Day : -26\) 初赛退役失败,准备复赛了... \(Day:0\) 早上\(7:30\)出发坐车去杭州,车上一直在听歌和睡觉中度过(话说锦零的歌真好听).. ...

  8. ThinkPHP composer的安装,及image图像处理类库的加载

    以下教程针对windows系统,示例系统使用win7 composer安装 下载composer安装包,点击安装. 出现'composer choose the command-line php' 要 ...

  9. Hinton等人新研究:如何更好地测量神经网络表示相似性

    Hinton等人新研究:如何更好地测量神经网络表示相似性 2019年05月22日 08:39:15 喜欢打酱油的老鸟 阅读数 177更多 分类专栏: 人工智能   https://www.toutia ...

  10. JAVA问题String literal is not properly closed by a double-quote

    String literal is not properly closed by a double-quote 这个错误:string字串没有以双引号结束String DBURL = "jd ...