`
ming_fanglin
  • 浏览: 224528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 内存溢出的一些解决办法

阅读更多
在模拟器上给gallery放入图片的时候,出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget 异常,图像大小超过了RAM内存。
      模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:

//解决加载图片 内存溢出的问题
                    //Options 只保存图片尺寸大小,不保存图片到内存
                BitmapFactory.Options opts = new BitmapFactory.Options();
                //缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰
                opts.inSampleSize = 4;
                Bitmap bmp = null;
                bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);                             

                ...              

               //回收
                bmp.recycle();

通过上面的方式解决了,但是这并不是最完美的解决方式。

通过一些了解,得知如下:

优化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); 即可。


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

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

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

VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理


bitmap 设置图片尺寸,避免 内存溢出 OutOfMemoryError的优化方法
★android 中用bitmap 时很容易内存溢出,报如下错误:Java.lang.OutOfMemoryError : bitmap size exceeds VM budget

● 主要是加上这段:
BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;

● eg1:(通过Uri取图片)
private ImageView preview;
BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
                    Bitmap bitmap = BitmapFactory.decodeStream(cr
                            .openInputStream(uri), null, options);
                    preview.setImageBitmap(bitmap);
以上代码可以优化内存溢出,但它只是改变图片大小,并不能彻底解决内存溢出。
● eg2:(通过路径去图片)
private ImageView preview;
private String fileName= "/sdcard/DCIM/Camera/2010-05-14 16.01.44.jpg";
BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一
                        Bitmap b = BitmapFactory.decodeFile(fileName, options);
                        preview.setImageBitmap(b);
                        filePath.setText(fileName);

★Android 还有一些性能优化的方法:
●  首先内存方面,可以参考 Android堆内存也可自己定义大小 和 优化Dalvik虚拟机的堆内存分配

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

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

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

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

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

2
1
分享到:
评论

相关推荐

    android加载大量图片内存溢出的三种解决办法

    android加载大量图片内存溢出的三种解决办法

    Android 内存溢出的一些解决办法.doc

    本文将详细探讨几种解决Android内存溢出的方法。 首先,针对图像导致的内存溢出,一种常见的解决方案是使用`BitmapFactory.Options`类进行图片解码时的尺寸控制。例如,在创建`Bitmap`对象时,可以设置`...

    图片过大引起的内存溢出解决方案

    ### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...

    Android webview 内存泄露的解决方法

    Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...

    Android的内存机制和溢出说明

    内存溢出(OutOfMemoryError)是Android开发中常见的问题,特别是在处理大尺寸的位图(Bitmap)时。由于Android设备的内存有限,长时间持有资源的引用会导致内存无法被回收,从而引发内存泄露。内存泄露不仅浪费资源...

    Android应用源码之防止内存溢出浅析.zip

    解决办法是使用Handler的弱引用来持有Message。 2. 关闭Cursor:数据库查询返回的Cursor在使用完毕后必须关闭,否则可能导致SQLiteCursor泄漏。 3. 注意服务的生命周期:长时间运行的服务可能导致内存消耗过大,应在...

    5个Android开发中比较常见的内存泄漏问题及解决办法

    下面搜罗了5个Android开发中比较常见的内存泄漏问题及解决办法,分享给大家,一起来看看吧。  一、单例造成的内存泄漏 android的单列大家都喜欢使用。但单例模式的静态特征使得他的生命周期和应用的生命周期一样长...

    Android内存管理

    **2.5 内存溢出的解决办法** 当遇到内存溢出问题时,可以尝试以下方法: - **优化图像资源**: 对图像资源进行优化,减少内存消耗。 - **调整Dalvik堆大小**: 可以通过调整Dalvik堆的大小来增加可用内存。 - **...

    Android内存研究

    十二、OOM 及解决办法1)合理使用 Bitmap:压缩图片、使用内存缓存、避免大图直接加载到内存。 2)避免内存泄露:定期检查并修复潜在的内存泄露问题。 3)优化数据结构:减少不必要的对象创建,使用合适的数据结构。 4)...

    android开发如何做好内存优化.doc

    - 对于图片资源,使用像Glide或Picasso这样的库进行加载和缓存管理,防止内存溢出。 - 根据屏幕尺寸和设备密度加载适当大小的图片,避免加载过大的图片导致内存压力。 10. 对象池和复用策略: - 对于频繁创建和...

    详解Android使用Handler造成内存泄露的分析及解决方法

    内存泄露的危害就是会使虚拟机占用内存过高,导致 OOM(内存溢出),程序出错。对于 Android 应用来说,就是你的用户打开一个 Activity,使用完之后关闭它,内存泄露;又打开,又关闭,又泄露;几次之后,程序占用...

    ANDROID 开发文档.pdf

    - **概述**:解决Bitmap对象操作过程中可能出现的内存溢出等问题。 - **应用场景**:优化图像处理性能。 **11. ANDROID状态条永不消失的处理方法** - **概述**:确保状态栏始终可见,不会因为特定操作而隐藏。 - **...

    加载大图片、内存缓存、diskCache

    解决办法是在Adapter的`getView()`方法中,确保在显示新图片前清除旧的Bitmap,可以使用`imageView.setImageBitmap(null)`来实现。 最后,本地缓存图片通常使用diskCache,即磁盘缓存。Android提供了`DiskLruCache`...

    Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法

    "Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法" Android 通过Intent调用系统拍照程序出现图片太小的问题解决办法是 Android 开发中常见的问题之一。这个问题的出现是因为当我们通过Intent调用...

    Android-Universal-Image-Loader-1.9.5

    2. **利用软引用**:避免内存溢出,使用软引用存储图片对象。 3. **优化图片源**:减小图片尺寸、压缩质量,减轻服务器和客户端的压力。 4. **使用异步加载策略**:确保用户在等待期间能有反馈。 六、常见问题及...

    2024-Android高级面试题

    - **内存溢出**:应用消耗过多内存导致系统回收资源。 - **错误处理不当**:例如空指针异常未妥善处理。 - **栈溢出**:方法调用层次过深导致栈溢出。 - **解决办法**: - **内存管理**:合理规划内存使用,及时...

    Android中Memory Leak原因分析及解决办法

    在Android开发过程中,我们经常碰到的情况就是在我们不清楚为什么情况下,程序突然出现Crash了。其中有一类日志相信...影响:Android系统能够为每个应用程序分配的内存是有限的,当一个应用程序中产生的内存泄露过多

Global site tag (gtag.js) - Google Analytics