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的值,单位MB
ActivityManager.getLargeMemoryClass()可以获取dalvik.vm.heapsize的值,单位MB
Runtime.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优化的更多相关文章

  1. Android避免OOM(内存优化)

    Android内存优化是性能优化很重要的一部分,而如何避免OOM又是内存优化的核心. Android内存管理机制 android官网有一篇文章 Android是如何管理应用的进程与内存分配 Andro ...

  2. Android应用性能优化(转)

    人类大脑与眼睛对一个画面的连贯性感知其实是有一个界限的,譬如我们看电影会觉得画面很自然连贯(帧率为24fps),用手机当然也需要感知屏幕操作的连贯性(尤其是动画过度),所以Android索性就把达到这 ...

  3. Android客户端性能优化(魅族资深工程师毫无保留奉献)

    本文由魅族科技有限公司资深Android开发工程师degao(嵌入式企鹅圈原创团队成员)撰写,是degao在嵌入式企鹅圈发表的第一篇原创文章,毫无保留地总结分享其在领导魅族多个项目开发中的Androi ...

  4. android app性能优化大汇总(内存性能优化)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

  5. Android的内存优化

    腾讯公司在五月三十一日开展[腾讯Bugly移动开发人员沙龙]大会.大会上面叶方正老师解说了 关于Android的内存优化的问题,只是我感觉叶老师许多其它的站在了測试的角度上去解释了这一方面,叶老师给我 ...

  6. Android的oom详解

    Android的oom原因 1.资源对象没关闭造成的内存泄露,try catch finally中将资源回收放到finally语句可以有效避免OOM.资源性对象比如: 1-1,Cursor 1-2,调 ...

  7. 包建强的培训课程(9):Android App性能优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  8. Android应用性能优化系列视图篇——隐藏在资源图片中的内存杀手

    图片加载性能优化永远是Android领域中一个无法绕过的话题,经过数年的发展,涌现了很多成熟的图片加载开源库,比如Fresco.Picasso.UIL等等,使得图片加载不再是一个头疼的问题,并且大幅降 ...

  9. fir.im Weekly - 如何进行 Android App 性能优化

    关于 Android App 的优化,@anly-jun 用 3 个月完成了这一系列文章,从 性能分析工具 到 ANR .Layout .消除卡顿 到 内存优化.内存分析工具大概十五六篇,并对此做一个 ...

随机推荐

  1. Java未被捕获的异常该怎么处理

    在你学习在程序中处理异常之前,看一看如果你不处理它们会有什么情况发生是很有好处的.下面的小程序包括一个故意导致被零除错误的表达式.class Exc0 {    public static void ...

  2. Attribute和自定义Property

    property(属性) attribute(特性) property和attribute的同步 id href value class/className 旧IE的趣事 attribute作为DOM ...

  3. ArcGIS10.1 发布气温插值GP服务

    首先通过ModelBuilder 工具 构建模型 然后通过模块右键 设置输入参数 或者直接将一个模块设为输入参数 在输出模块的右键属性上 可以设置lyr文件用于渲染 设置数据添加到显示用于不是发布的时 ...

  4. 自定义CollectionViewLayout

    转自answer-huang的博客 原文出自:Custom Collection View Layouts    UICollectionView在iOS6中第一次被介绍,也是UIKit视图类中的一颗 ...

  5. kafka常用命令

    以下是kafka常用命令行总结: 0.查看有哪些主题: ./kafka-topics.sh --list --zookeeper 192.168.0.201:12181 1.查看topic的详细信息 ...

  6. mysql 删除时候有外键提示问题解决

    在直接调用delete 语句的时候,如果出现了外键错误提示的时候,可以考虑用下面的语句执行. 原理是去除外键提示,先用外键约束,再取消外键约束即可 SET FOREIGN_KEY_CHECKS=1;D ...

  7. Spring配置文件详解

      转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常有用 spring配置文件是用于指导Sp ...

  8. vue 导航钩子

    导航钩子 (译者:『导航』表示路由正在发生改变.) 正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消.有多种方式可以在路由导航发生时执行钩子:全局的, 单个路由独享的 ...

  9. Hadoop深入浅出实战经典–第02讲

    本文转载:通通学--知识学习与分享平台 Hadoop的核心 HDFS: Hadoop Distributed File System 分布式文件系统 MapReduce:并行计算框架 Yarn:集群资 ...

  10. python 学习随笔

    要求: 用户输入一个数,比如输入387. 需要把387打乱,然后将这三个数组合成最大数输出. 如果最大值和用户输入的等大,输出-1. 方法一: #!/user/bin/env python # _*_ ...