`
luckliu521
  • 浏览: 259016 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android 内存溢出问题分析

阅读更多
Android虽然会自动管理内存,JAVA也有garbage collection (GC )内存回收机制。

但是如果程序在一次操作中打开几个M的文件,那么通常会出现下面的错误信息。

02-04 21:46:08.703: ERROR/dalvikvm-heap(2429): 1920000-byte external allocation too large for this process.

02-04 21:52:28.463: ERROR/AndroidRuntime(2429): java.lang.OutOfMemoryError: bitmap size exceeds VM budget

移动终端因为内存有限,往往图片处理经常出现上述的错误。

解决方法:

1.明确调用System.gc();

   这种内存回收会有一定的作用,但是请不要太期待。

2.图片处理完成后回收内存。

  请在调用BitMap进行图片处理后进行内存回收。

  bitmap.recycle();

  这样会把刚刚用过的图片占用的内存释放。

3.图片处理时指定大小。

  下面这个方法处理几个M的图片时是必须的。


view plaincopy to clipboardprint?
BitMap getBitpMap(){ 
ParcelFileDescriptor pfd; 
try{ 
    pfd = mCon.getContentResolver().openFileDescriptor(uri, "r"); 
}catch (IOException ex){ 
    return null; 

java.io.FileDescriptor fd = pfd.getFileDescriptor(); 
BitmapFactory.Options options = new BitmapFactory.Options(); 
    //先指定原始大小 
options.inSampleSize = 1; 
    //只进行大小判断 
    options.inJustDecodeBounds = true; 
    //调用此方法得到options得到图片的大小 
    BitmapFactory.decodeFileDescriptor(fd, null, options); 
    //我们的目标是在800pixel的画面上显示。 
    //所以需要调用computeSampleSize得到图片缩放的比例 
    options.inSampleSize = computeSampleSize(options, 800); 
    //OK,我们得到了缩放的比例,现在开始正式读入BitMap数据 
    options.inJustDecodeBounds = false; 
    options.inDither = false; 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
     
    //根据options参数,减少所需要的内存 
    Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null, options); 
    return sourceBitmap; 

//这个函数会对图片的大小进行判断,并得到合适的缩放比例,比如2即1/2,3即1/3 
static int computeSampleSize(BitmapFactory.Options options, int target) { 
    int w = options.outWidth; 
    int h = options.outHeight; 
    int candidateW = w / target; 
    int candidateH = h / target; 
    int candidate = Math.max(candidateW, candidateH); 
    if (candidate == 0) 
        return 1; 
    if (candidate > 1) { 
        if ((w > target) && (w / candidate) < target) 
            candidate -= 1; 
    } 
    if (candidate > 1) { 
        if ((h > target) && (h / candidate) < target) 
            candidate -= 1; 
    } 
    if (VERBOSE) 
        Log.v(TAG, "for w/h " + w + "/" + h + " returning " + candidate + "(" + (w/candidate) + " / " + (h/candidate)); 
    return candidate; 

分享到:
评论

相关推荐

    Android 内存溢出问题

    本篇文章将深入探讨Android内存管理的两个核心概念:堆(Heap)和栈(Stack),以及如何理解和解决Android内存溢出问题。 1. 堆与栈 堆和栈是Java虚拟机(JVM)中的两种主要内存区域,它们各自具有特定的用途和...

    android 图片下载 有效解决内存溢出问题

    在Android开发中,图片下载和显示是常见的操作,但如果不恰当处理,很容易引发内存溢出(Out of Memory,简称OOM)问题。内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,导致程序崩溃。对于Android应用...

    Android防止内存溢出浅析.zip

    在Android应用开发中,内存溢出(Out Of Memory,简称OOM)是一个常见的问题,它会导致应用崩溃,严重影响用户体验。理解并防止Android应用中的内存溢出是优化应用性能的关键环节。以下是对Android防止内存溢出的...

    针对Android应用中Gallery内存溢出的解决方案.pdf

    综上所述,OOMS方案通过优化图片加载流程、动态内存管理和智能压缩算法,有效解决了Android应用中Gallery内存溢出的问题。该方案不仅提升了用户体验,也增强了应用的稳定性和兼容性,对于开发涉及大量图片展示的移动...

    Android防止内存溢出浅析

    首先,我们需要理解Android内存管理的基本原理。Android应用程序基于Java语言,因此其内存机制与Java相似。Java的垃圾回收(GC)机制会自动回收不再使用的对象,但并不意味着开发者可以完全忽视内存管理。Android系统...

    android双缓冲解决图片内存溢出的问题

    在Android开发中,处理大量的图片资源时,常常会遇到内存溢出(Out Of Memory,简称OOM)的问题。这是因为Android系统为每个应用分配的内存有限,当加载过多或过大的图片时,很容易超出这个限制,导致应用崩溃。为了...

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

    在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的设备上更为明显。本文将详细介绍如何...

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

    总之,解决Android内存溢出问题需要综合运用多种策略,包括合理控制图片尺寸、优化虚拟机堆内存分配、自定义堆内存大小以及采用高效的图片加载和缓存机制。在开发过程中,应持续关注应用的内存使用情况,使用内存...

    基于Android防止内存溢出浅析

    在Android开发中,内存管理是至关重要的一个环节,因为不当的内存使用可能导致应用程序崩溃或性能下降,最常见的问题就是内存溢出(Out Of Memory,简称OOM)。本文将深入浅析如何在Android环境中预防和处理内存溢出...

    Android内存溢出及内存泄漏原因进行

    内存溢出(Out Of Memory, OOM)和内存泄漏是两个常见的问题,它们可能导致应用崩溃、性能下降甚至用户体验恶化。下面我们将详细探讨这两个问题的原因以及相应的解决方案。 内存溢出(OOM)通常发生在应用程序请求...

    防止内存溢出浅析

    内存溢出(Out of Memory,简称OOM)是计算机科学中的一种常见问题,特别是在资源有限的移动设备如Android手机上,处理不当可能导致应用崩溃。本文将深入浅谈如何防止Android应用程序中的内存溢出。 首先,我们需要...

    安卓Android源码——防止内存溢出浅析.zip

    通过理解Android内存管理机制,掌握上述防止内存溢出的策略,并结合实际项目中的源码分析,开发者可以有效地优化应用内存使用,提升应用的稳定性和性能。定期进行内存压力测试和代码审查,也能及时发现并修复潜在的...

    Android 内存泄露 Mat工具分析

    安装完成后,需要配置 VM 参数 -XX:+HeapDumpOnOutOfMemoryError,以便在出现内存溢出时生成 heap dump 文件。 使用 MAT 分析 heap dump 使用 MAT 分析 heap dump 文件可以发现内存泄露的根源。MAT 提供了多种视图...

    android内存分析

    2. **Android内存溢出** Android的Dalvik虚拟机内存限制通常为16MB或24MB,这意味着我们需要谨慎管理内存。内存溢出主要由两方面原因导致: - **内存泄漏**:由于编程错误,比如长时间保持对某些资源(如Context)...

    android内存及内存溢出分析详解

    Android的内存管理与Java的内存管理紧密相关,主要依赖于垃圾回收器(GC)进行对象的自动回收...总的来说,理解Android内存机制和内存溢出的原因,以及采取适当的预防措施,对于开发高效、稳定的Android应用至关重要。

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

    内存溢出(Out of Memory,简称OOM)是Android开发者经常面临的问题,它可能导致应用崩溃或者性能下降。本资料"Android应用源码之防止内存溢出浅析"正是针对这一问题提供了解决方案。下面,我们将深入探讨Android...

    android有效解决图片过大内存溢出的问题

    ### Android有效解决图片过大内存溢出的问题 #### 一、问题背景 在Android开发过程中,尤其是在涉及大量图片处理的应用程序中,经常会遇到内存溢出的问题。这是因为Android设备的内存资源有限,而图片作为数据量较...

    Android 图片下载以及内存处理防止OOM内存溢出 源码

    在Android开发中,图片的加载和内存管理是一个关键问题,特别是考虑到防止因内存溢出(Out Of Memory,简称OOM)而导致应用崩溃。本教程将详细探讨如何在Android中有效地进行图片下载和内存处理,以避免OOM的发生。 ...

Global site tag (gtag.js) - Google Analytics