zoukankan      html  css  js  c++  java
  • androidjava.lang.OutOfMemoryError: bitmap size exceeds VM budge

    This answer has 2 parts

    1) its not how much images the screen has, but being carefull on cleaning everything up when finishing the activity

    2) Android dev site (http://developer.android.com/resources/articles/future-proofing.html)

    Technique to Avoid, #3: Going Overboard with Layouts

    Due to changes in the View rendering infrastructure, unreasonably deep (more than 10 or so) or broad (more than 30 total) View hierarchies in layouts are now likely to cause crashes. This was always a risk for excessively complex layouts, but you can think of Android 1.5 as being better than 1.1 at exposing this problem. Most developers won't need to worry about this, but if your app has very complicated layouts, you'll need to put it on a diet. You can simplify your layouts using the more advanced layout classes like FrameLayout and TableLayout.

    Part II:

    Android一些性能优化的方法:

    1. 首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配

    2. 基础类型上,因为Java没有实际的指针,在敏感运算方面还是要借助NDK来完成。Android123提示游戏开发者,这点比较有意思的是Google 推出NDK可能是帮助游戏开发人员,比如OpenGL ES的支持有明显的改观,本地代码操作图形界面是很必要的。

    3. 图形对象优化,这里要说的是Android上的Bitmap对象销毁,可以借助recycle()方法显示让GC回收一个Bitmap对象,通常对一个不用的Bitmap可以使用下面的方式,如

    if(bitmapObject.isRecycled()==false) //如果没有回收
    bitmapObject.recycle();

    4. 目前系统对动画支持比较弱智对于常规应用的补间过渡效果可以,但是对于游戏而言一般的美工可能习惯了GIF方式的统一处理,目前Android系统仅能预览GIF的第一帧,可以借助J2ME中通过线程和自己写解析器的方式来读取GIF89格式的资源。

    5. 对于大多数Android手机没有过多的物理按键可能我们需要想象下了做好手势识别 GestureDetector 和重力感应来实现操控。通常我们还要考虑误操作问题的降噪处理。

    Android堆内存也可自己定义大小

    对于一些大型Android项目或游戏来说在算法处理上没有问题外,影响性能瓶颈的主要是Android自己内存管理机制问题,目前手机厂商对RAM都比 较吝啬,对于软件的流畅性来说RAM对性能的影响十分敏感,除了上次Android开发网提到的 优化Dalvik虚拟机的堆内存分配 外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的 dalvik.system.VMRuntime类来设置最小堆内存为例:

    private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ;

    VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理,我们将在下次提到具体应用。

    优化Dalvik虚拟机的堆内存分配

    对于Android平台来说,其托管层使用的Dalvik Java VM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用 dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体 原理我们可以参考开源工程,这里我们仅说下使用方法: private final static float TARGET_HEAP_UTILIZATION = 0.75f; 在程序onCreate时就可以调用 VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION); 即可。

    Part III:

    捕获OOM异常

    try {

    ……

    } catch (OutOfMemoryError e) {

    e.printStackTrace();

    }

    java.lang.OutOfMemoryError:bitmap size exceeds VM budget

    是 Bitmap bm = BitmapFactory.decodeFile(path)引起的,Path是sd卡中图片的路径,如果图片过大就会产生错误;

    查找资料得知:
    BitmapFactory.Options options=new BitmapFactory.Options();
    options.inSampleSize = 10;
    Bitmap bmp=BitmapFactory.decodeFile(path,options);

    修改采样可以避免这个问题,但是这个inSampleSize该如何确定?1000*1000的图片缩小10倍,可以避免内存溢出;但是本身很小的图片也缩小10倍,并不是我想要的结果。。。。。怎么做可以兼顾?
    介绍一下图片占用进程的内存算法吧。
    android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:
    图片的width*height*Config。
    如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。
    前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的 skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。

  • 相关阅读:
    请实现一个js脚本,要求做到将数字转化为千分位表示如:1234567转化为1,234,567
    Linux mlocate安装
    Linux CentOS7网络简单配置
    Linux 常见命令 文件搜索命令
    Linux 常见命令 权限管理命令
    Linux 常见命令 链接命令
    Linux 常见命令 文件处理指令
    List与Set的contains方法效率问题
    集合介绍
    Arrays.asList()
  • 原文地址:https://www.cnblogs.com/xuewater/p/2810318.html
Copyright © 2011-2022 走看看