Android面试系列文章2018之异常处理OOM异常篇
2018-02-26 20:56
351 查看
Android面试系列文章2018之异常处理OOM异常篇
1.什么是OOM?
当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out OfMemory异常。
2.一些容易混淆的概念
[1]内存溢出:就是OOM异常 。 当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out OfMemory异常。
[2]内存抖动:内存抖动是由于短时间内有大量对象进出Young Generiation区导致的,它伴随着频繁的GC。
[3]内存泄漏:内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。
3.如何解决OOM
a.Bitmap的优化图片显示:加载合适尺寸的图片。
及时释放内存:Bitmap的内存分为java区和C(native)区,,由于C区无法自动回收,所以需要调用Bitmap的recycle()方法对C区的内存进行回收。
图片压缩:适当的时候对比例比较大的图片进行压缩,以节约内存。http://blog.csdn.net/HarryWeasley/article/details/51955467
inBitmap属性:此属性提高Android系统在Bitmap分配和释放的执行效率。
捕获异常:对OOM异常进行捕获。从而作出合适的措施。注意OOM是Error,不是Exception。
b.ListView的优化/LRU(最近最少使用机制)
优化一:在Adapter中的getView方法中使用ConvertView,即ConvertView的复用,不需要每次都inflate一个View出来,这样既浪费时间,又浪费内存。
优化二:使用ViewHolder,不要在getView方法中写findViewById方法,因为getView方法会执行很多遍,这样也可以节省时间,节约内存。
优化三:使用分页加载,讲真实际开发中,ListView的数据肯定不止几百条,成千上万条数据你不可能一次性加载出来,所以这里需要用到分页加载,一次加载几条或者十几条,但是如果数据量很大的话,像qq,微信这种,如果顺利加载到最后面的话,那么你的list中也会有几万甚至几十万的数据,这样可能也会导致OOM,所以你的数据集List中也不能有那么多数据,所以每加载一页的时候你可以覆盖前一页的数据。
优化四:如果数据当中有图片的话,使用第三方库来加载(也就是缓存),LRU,如果你的能力强大到能自己维护的话,那也不是不可以。
优化五:当你手指在滑动列表的时候,尽可能的不加载图片,这样的话滑动就会更加流畅。
c.避免在onDraw方法里面执行对象的创建
d.谨慎使用多进程
相关文章推荐
- Android面试系列文章2018之Java部分异常篇
- Android面试系列文章2018之Java部分类加载器篇
- Android面试系列文章2018之Android部分IntentService机制篇
- Android面试系列文章2018之实战经验部分之依赖注入框架篇
- Android面试系列文章2018之内存管理篇
- Android面试系列文章2018之进程保活篇
- Android面试系列文章2018之实战经验部分之网络框架篇
- Android面试系列文章2018之Android部分AsyncTask机制篇
- Android面试系列文章2018之Android构建流程篇
- Android面试系列文章2018之Andrlid代码分析lint检查篇
- Android面试系列文章2018之实战经验部分之异步框架篇
- Android面试系列文章2018之Java部分注解篇
- Android面试系列文章2018之Android部分Handler机制篇
- Android面试系列文章2018之Android部分View绘制机制篇
- Android面试系列文章2018之Android部分之动画机制篇
- Android面试系列文章2018之ListView篇
- Android面试系列文章2018之实战经验部分之gradle篇
- Android面试系列文章2018之内存管理之冷启动过优化篇
- Android面试系列文章2018之Java部分反射机制篇
- Android面试系列文章2018之内存管理之UI卡顿篇