【问题标题】:Android out of memory when assigning variables分配变量时Android内存不足
【发布时间】:2013-01-02 04:07:38
【问题描述】:

所以我明白了:

'01-01 20:37:34.859: E/dalvikvm-heap(19921): Out of memory on a 6471856-byte allocation.'

当试图将一堆变量分配给内存时。 我正在分配 24 个这样的变量:

mElements.add(new ShopElement(getResources(),R.drawable.shop_starter, b1X , b1Y,true,1,"red",true,5,checkLocked(0)));

其中之一:

bNumbers = new Bitmap[] {Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h0)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h1)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h2)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h3)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h4)
        ,65,65,true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h5)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h6)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h7)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h8)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.h9)
        , 65,65, true),
        Bitmap.createScaledBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.time)
                , 50,50, true)};

但在我完成创建的 24 个元素中的第 16 个之前,它在某些手机上崩溃了。

我有一个 Galaxy S2,它运行良好,但在 S3 和其他手机上它会崩溃。

我很乐意应要求提供更多信息。

我之前搜索过此错误,尝试应用解决方案,并查看了“有效显示位图”的内容,但似乎没有任何帮助。

让我头疼的是它在 S2 上工作,但在 S3 上却不行。 S3不应该在各个方面都超过S2吗?

我正在使用全局 BitmapFactory.Options 来绘制我的所有位图,我将选项设置如下:

Global.opts = new BitmapFactory.Options();
    Global.opts.inDither=false;                     
    Global.opts.inPurgeable=true;                  
    Global.opts.inInputShareable=true;              
    Global.opts.inTempStorage=new byte[16 * 1024]; 

【问题讨论】:

  • 当然。您将这么多位图放入内存。尝试完善你的逻辑。
  • 我的猜测是,它崩溃的手机的可用内存比没有崩溃的手机少。调整图像大小通常在内存方面非常昂贵,可能会将其分块以便垃圾收集有时间工作。
  • 我没有“分块”的经验。这是否意味着我应该按框架分开分配组变量?
  • 天哪!您是否真的将 6.5++ MB 图像加载到您的手机中???? 50K - 合理。 1MB - 大。 6.5MB - Fuggedabouddit!恕我直言...
  • 显然,我是。我还没有计算出图像的总大小,但显然。

标签: android memory bitmap


【解决方案1】:

只是你试图访问比你拥有的更多的内存。因此解决方案是增加内存或仅使用可用内存。

三个建议。

1) 如果您使用BitmapFactory.Options 并且错误仍然存​​在,则表示您没有为给定图像使用正确的配置。 只需确保堆大小足够。

 BitmapFactory.Options opts=new BitmapFactory.Options();
        opts.inDither=false;                     //Disable Dithering mode
        opts.inSampleSize = 8;                    // scale image upto 1/8 of the original image.
        opts.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
        opts.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
        opts.inTempStorage=new byte[16 * 1024]; //you can increase this value as per your need.

您可以使用inSampleSize 属性增加inTempStorage 的大小以使其正常工作或sample 图像。有关采样的更多信息,您可以参考此link。

尝试使用不同的选项。它应该可以工作。

2) 您还可以通过在manifest 文件中使用android:largeHeap="true" 属性来增加应用程序的整体堆大小,但这不适用于任何预 Honeycomb 设备。在 2.3 之前的设备上,您可以使用 VMRuntime 类。

3) 如果您想以编程方式检测堆大小并希望根据需要更改它,那么您可以关注link。

【讨论】:

  • 我编辑了问题以包含我如何使用选项的示例。我会尝试增加堆大小
  • 那行不通。每当我尝试应用 'android:largeHeap="true"' 时,它只会给我一个红色 X 并说“找不到资源标识符”
  • 包含“inSampleSize”似乎可行,但现在一切看起来都很糟糕。但它有效,所以你明白了。我将尝试使用样本大小并检测堆大小并动态调整它,直到找到更好的方式来加载我的 34 位图
  • 另外:尽可能使用最小的位图。您将使用更少的内存。但更重要的是,您的应用程序应该运行得更快,并且使用起来更具吸引力。恕我直言..
【解决方案2】:

错误清楚地表明您正在尝试使用更多内存。这直接指向图像大小。因此,您需要调整图像大小以使用更少的内存。出于这个原因可以使用的一个是BitmapFactory.Option。或者手动调整图像大小,注意它是否适合您的所有需求。只是为了说明问题,

堆大小是分配给应用程序的内存量 执行。 android 应用程序的堆大小由设备决定 内存。例如,如果设备的 RAM 为 179 MB,则 android 应用程序只会获得 18MB 的堆大小。

了解更多here。更多关于如何有效加载大型位图的信息,请参见here。

我有一个 Galaxy S2,它运行良好,但在 S3 和其他手机上它运行良好 崩溃

检查您提到的设备的 RAM 大小。

【讨论】:

  • 我正在使用 BitmapFactory.Option
  • inSampleSize 试试这个。
  • 感谢您对 inSampleSize 的建议。它有效,但是自从 CCMinds 将其放在答案中以来,我就将其归功于他。我希望你不要介意。反正你有一堆积分和奖牌
【解决方案3】:

在 Android 内存管理中,每个应用都有一个最大堆内存可以使用,一旦应用使用超过堆内存 Android 操作系统会自动杀死该应用。所以只有你得到“Out of Memory Exception”..

要解决这个问题,您可以使用 Android 的 NDK 概念。因为堆概念是针对 SDK 部分的。。

即

您可以使用 NDK 使应用程序使用超过 300MB(如果可用)的 RAM,但在 SDK 中是不可能的

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 2012-09-16
    • 2011-06-15
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多