Android 防止OOM优化
1. Android2.x及以下的系统优化:
Bitmap被解码后的像素被存储在Native Heap中,
Dalvik Heap有个external计数,记录了Bitmap所占用的内存。
当 Dalvik Allocated + External Allocated + new Allocated>= 允许分配最大值时,就会引发OutOfMemoryError异常,
销毁的时候必须要调用recycle()。BitmapFactory.Options参数,隐藏了inNativeAlloc属性,
可以使Bitmap的内存不算在Dalvik Heap中。
2. Android 3.x及以上的系统优化:
Bitmap被解码后的像素被存储在Java Heap,只要Bitmap没有
被引用,在内存紧张时就会被回收,不需要主动调用recycle。只有当 Dalvik Allocated + new Allocated>= 允许分配最大值时,
就会引发OutOfMemoryError异常,BitmapFactory.Options参数,有个inPurgeable属性,开启后像素会存储在Native Heap中,
有个缺陷就是,在Bitmap显示时如何Native Heap中没有缓存,又需要重新解码,会阻塞UI线程。
可以在jni层通过AndroidBitmap_lockPixels把解码后的内存锁住,防止被回收,然后在不适用时通过AndroidBitmap_unlockPixels(env, zBitmap)
来取消加锁(可以参考Fresco的实现)
3. AndroidManifest.xml设置largeHeap=true
ActivityManager.getMemoryClass()可以获取dalvik.vm.heapgrowthlimitd的值,单位MBActivityManager.getLargeMemoryClass()可以获取dalvik.vm.heapsize的值,单位MBRuntime.getRuntime().maxMemory()获取当前VM的最大可用内存,单位Byte
4. 对Bitmap的创建封装统一的入口
使用LruCache减少Bitmap频繁的create
尽量使用decodeStream代替decodeResource decodeFile
使用catch,当发生OOM时,主动执行GC,降低图片灰度值,再次创建
根据view的实际大小来解码相应大小的bitmap
5. 防止内存泄露
避免使用生命周期长的对象应用生命周期短的对象(使用 static关键字,单例中的引用)
注意注册与反注册配对使用
使用leakcanary工具来动态追踪内存泄露,使用MAT来静态分析内存泄露。
6.不要频繁的分配大内存对象,不适用的对象提前置NULL,提前回收。
Android 防止OOM优化的更多相关文章
- Android避免OOM(内存优化)
Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...
- Android应用性能优化(转)
人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...
- Android客户端性能优化(魅族资深工程师毫无保留奉献)
本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...
- android app性能优化大汇总(内存性能优化)
转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...
- Android的内存优化
腾讯公司在五月三十一日开展[腾讯Bugly移动开发人员沙龙]大会.大会上面叶方正老师解说了 关于Android的内存优化的问题,只是我感觉叶老师许多其它的站在了測试的角度上去解释了这一方面,叶老师给我 ...
- Android的oom详解
Android的oom原因 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM.资源性对象比如: 1-1,Cursor 1-2,调 ...
- 包建强的培训课程(9):Android App性能优化
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手
图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...
- fir.im Weekly - 如何进行 Android App 性能优化
关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...
随机推荐
- FTPClient使用中的问题--获取当前工作目录为null
使用org.apache.commons.net.ftp.FTPClient 来做ftp的上传下载功能 FTPClient ftp = new FTPClient();ftp.connect(doc. ...
- struts标签
A:<s:a xhref=""></s:a>-----超链接,类似于html里的<a></a><s:action name=& ...
- Thinkphp批量添加数据
//新建规格public function construction(){ $id = $_GET['id'];//dump($id);die; $this->assign('id', $id) ...
- JavaScript中const、var和let区别浅析
在JavaScript中有三种声明变量的方式:var.let.const.下文给大家介绍js中三种定义变量的方式const, var, let的区别. 1.const定义的变量不可以修改,而且必须初始 ...
- if语句的一个小技巧
也就是说选中类型的时候边框属性的选择项是不能选择的一般用if else 在类型的CHANGE方法中,现在一句话就能搞定看代码 private void m_rdbtnProID2_CheckedCha ...
- [ASM C/C++] C语言数组
固定长度的数组: 可以具有任何的存储类别. 长度可变的数组: 只能具有自动的生存周期(定义于语句块内,眀没有static修饰符). 名字必须为一般的标识符,因此结构或联合的成员不能是数组的标识符. 读 ...
- Netsuite > Foreign Currency Revaluation 外币评估
MENU: Transactions > Financial > Revalue Open Currency Balances 使用频率: - 每个月月底,结账前, 手工操作. - 或者在 ...
- eclipse 4.5.2 源码修改 格式化Java代码
注:本文代码基于eclipse4.5.2 1. 需求:在换电脑之后,如何不用配置eclipse就可以很快进入开发呢,并保持原来的编码规范. 2. 方法:修改eclipse源码 分别修改了两个jar包2 ...
- android 触摸事件分析
背景知识: 触摸屏可以有多个触控点 android中管理触控点通过一个数组来管理,涉及到index和id两个变量, index表示在数组中的下标,id表示这个触控点(pointer)的id,point ...
- ceph官网的ceph块设备(二)——快照相关
一)快照基础命令 网址:http://ceph.sptty.com/rbd/rbd-snapshot/ 1. 创建快照 # rbd snap create yhcpool/yhctest@yhctes ...