【问题标题】:"java.lang.OutOfMemoryError" when new an int array in Android“java.lang.OutOfMemoryError”在 Android 中新建一个 int 数组时
【发布时间】:2013-01-06 15:26:50
【问题描述】:

问题出现在最后一行,当我尝试新建这样一个数组时,它崩溃了。在 Logcat 中,它显示“java.lang.OutOfMemoryError”。那是什么意思?请帮忙。

Bitmap bmap;
Bitmap bMapRotate;
int bmapWidth;
int bmapHeight;
int[] bmapColorArray;
int bmapColorArraySize;

bmapWidth = bmap.getWidth();
bmapHeight = bmap.getHeight();
bmapColorArraySize = bmapWidth * bmapHeight;
bmapColorArray = new int[bmapColorArraySize];
bmap.getPixels(bmapColorArray, 0, bmapWidth, 0, 0, bmapWidth, bmapHeight);

然后调用把这个int数组传给native层。

【问题讨论】:

  • 这意味着您尝试分配的内存超出了可用内存。一个 int 数组每个条目需要四个字节。那个位图有多大?
  • 我通过调用 BitmapFactory.decodeByteArray(data, 0, data.length); 得到 bmp;
  • 好的。我试了一个小数,所以没问题。也就是bmpColorArraySize太大,堆内存承受不起。所以这种方式可能行不通。问题是我想拍照传给native层,用JNI做一些计算,怎么办?

标签: android arrays out-of-memory


【解决方案1】:

Android 应用程序的可用内存量有限。取决于屏幕分辨率/大小,从 16MB 到 24MB (IIRC)。

因此,如果您为大图像(10M 像素)分配多个数组,您的内存很快就会满。

尽量只存储必要的信息。如果您正在使用图像的缩放版本(您可能是)存储缩放版本而不是完整的原始版本。此外,不要将您(可能)不会再次使用的图像保存在内存中。

换句话说,尽量对内存保持保守,尤其是在分配大量内存的情况下。

【讨论】:

  • @nlsbshtr 是的。它有助于丢弃未使用的位图。仅存储缩放的也无济于事。这仍然是需要做的事情!
  • 所以我想拍一张图片传给native层,用JNI做一些计算,怎么办?
  • 确保您的图像适合您的记忆(使用我提供的提示),您无能为力。
【解决方案2】:

手动调用垃圾收集器。

System.gc();

【讨论】:

    【解决方案3】:

    如果你想避免崩溃,试试这个。

     Runtime runtime = Runtime.getRuntime();  
    
        Log.d("Free memory",""+runtime.freeMemory());  
    
        if(runtime.freeMemory()>(h*w)) 
        {
            int[] i = new int[h* w];
        }
        else
        {
            Toast.makeText(getApplicationContext(),"No More Heap memory",Toast.LENGTH_LONG).show();
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      相关资源
      最近更新 更多