Android异常与性能优化相关面试问题-OOM异常面试问题详解
什么是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异常面试问题详解的更多相关文章
- Android异常与性能优化相关面试问题-内存管理面试问题详解
内存管理机制概述: 分配机制:操作系统会为每一个进程分配一个合理的内存大小,从而保证每一个进程能够正常的运行,不至于内存不够使用,或者某个进程占用过多的内存. 回收机制:在系统内存不足的时候,系统有一 ...
- Android异常与性能优化相关面试问题-ui卡顿面试问题详解
UI卡顿原理: “60fps(Frames Per Second每秒传输帧数) ----> 16ms” 针对上面标红的数字,下面具体说明一下:最主要的根源在于渲染性,Android会每隔16ms ...
- Android异常与性能优化相关面试问题-其他优化面试问题详解
Android不用静态变量存储数据: 静态变量等数据由于进程已经被杀死而被初始化.在Android中应用进程不是安全的,因为它会有系统给kill掉,但是在实际中可能会有这样的一个假象:当app被杀掉之 ...
- Android异常与性能优化相关面试问题-冷启动优化面试问题详解
什么是冷启动: 冷启动的定义:冷启动就是在启动应用前,系统中没有该应用的任何进程信息.实际也就是要执行Application.onCreate()方法的那次启动. 冷启动 / 热启动的区别:热启动:用 ...
- Android异常与性能优化相关面试问题-内存泄漏面试问题讲解
Java内存泄漏基础知识: Java的内存的分配策略 a.静态存储区:也叫方法区,主要是存放一些静态数据及全局变量等,在程序编译时就已经分配好了,并且在静态存储区中存放的变量在整个程序运行期间都存在. ...
- Android异常与性能优化相关面试问题-ANR异常面试问题详解
什么是ANR? Application Not Responding 造成ANR的主要原因: 应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当监视到在A ...
- Android异常与性能优化相关面试问题-bitmap面试问题详解
recycle: 对于Bitmap来说内存分为Java内存和Native内存,而当图片不用时建议调用一下recycle()方法来将native层的内存进行回收,下面看一下它的源码官方对它的解释: LR ...
- 转——Android应用开发性能优化完全分析
[工匠若水 http://blog.csdn.net/yanbober 转载请注明出处.] 1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉 ...
- Android 应用开发性能优化完全分析
1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾.不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结.我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只 ...
随机推荐
- Leetcode之101. Symmetric Tree Easy
Leetcode 101. Symmetric Tree Easy Given a binary tree, check whether it is a mirror of itself (ie, s ...
- 产品之我见(2)-求职APP
在求职过程中使用了BOSS直聘.拉钩.领英这三款软件,下面来讲述一下作为求职者身份的使用感受以及遇到的问题. 一.BOSS直聘 手机端:打开首先是标语“互联网招聘神器”的页面 ...
- 如何查看Nginx安装了哪些模块
当你要编译安装Nginx时,在你执行完./configure之后,会在这个目录生成一个objs这个目录. 进入objs目录下,会看到有一个ngx_modules.c这个文件,这个文件里都是要编译进Ng ...
- merge效率
测试merge效率 测试说明: MERGE是oracle提供的一种特殊的sql语法,非常适用于数据同步场景,即: (把A表数据插到B表,如果B表存在相同主键的记录则使用A表数据对B表进行更新) 数 ...
- Opencv 简单视频播放器
// C++ header and namespace #include <iostream> #include <string> #include <cstdlib&g ...
- 一文搞懂 Java 中的枚举,写得非常好!
知识点 概念 enum的全称为 enumeration, 是 JDK 1.5 中引入的新特性. 在Java中,被 enum关键字修饰的类型就是枚举类型.形式如下: enum Color { RED, ...
- Python【无引号、单引号、双引号、三引号】
无引号#数字和数学运算是标准化.有固定格式的>>> print(520) 520>>> print(1+1)2 单引号#文字却能够千变万化>>> ...
- Pytest+allure安装和框架搭建
接口自动化框架搭建 -- 公司系统自测使用,只跑核心业务流程 编辑中...... 1.安装Pytest pip install -U pytest 1.1Pycharm测试脚本运行 创建project ...
- WPF的硬件加速
wpf根据硬件 可以做出三档的渲染 dx7以下 第0档 不支持硬件加速 dx7-dx9 第1档, 不支持所有硬件加速,但支持一部分 dx9 以上 支持所有硬件加速 可以用编程的方式取代 当前设备处于 ...
- css;js学习(一)
推荐基础前端学习地址https://ke.qq.com/course/315961蝉壳学院 清除浮动 .clearfix:before,.clearfix:after{ content: " ...