VM不允许我们分配**字节

11 浏览
0 Comments

VM不允许我们分配**字节

我的应用程序想要分配2529792字节的内存,在拥有128MB内存的设备上运行正常,但在拥有292MB可用内存的HTC上运行时报错。错误信息如下:\n01-14 21:08:27.972: E/GraphicsJNI(26585): VM won\'t let us allocate 2529792 bytes\n以下是我的LogCat输出:\n01-14 21:08:27.391: E/dalvikvm-heap(26585): 2529792字节的外部分配对于此进程过大。\n01-14 21:08:27.411: E/dalvikvm(26585): 内存不足:Heap Size=17735KB,已分配=14425KB,Bitmap Size=14641KB,Limit=32768KB\n01-14 21:08:27.411: E/dalvikvm(26585): Trim info: Footprint=17735KB,Allowed Footprint=17735KB,Trimmed=668KB\n01-14 21:08:27.512: E/GraphicsJNI(26585): VM won\'t let us allocate 2529792 bytes\n01-14 21:08:27.512: D/dalvikvm(26585): GC_FOR_MALLOC已释放905K,剩余内存24%,13520K/17735K,外部内存14641K/16689K,暂停93毫秒\n01-14 21:08:27.652: D/dalvikvm(26585): GC_EXTERNAL_ALLOC已释放3K,剩余内存24%,13552K/17735K,外部内存14641K/16689K,暂停116毫秒\n01-14 21:08:27.662: D/skia(26585): --- decoder->decode返回false\n01-14 21:08:27.792: D/dalvikvm(26585): GC_EXTERNAL_ALLOC已释放13K,剩余内存24%,13655K/17735K,外部内存14641K/16689K,暂停109毫秒\n01-14 21:08:27.872: E/dalvikvm-heap(26585): 2529792字节的外部分配对于此进程过大。\n01-14 21:08:27.872: E/dalvikvm(26585): 内存不足:Heap Size=17735KB,已分配=13655KB,Bitmap Size=14641KB,Limit=32768KB\n01-14 21:08:27.872: E/dalvikvm(26585): Trim info: Footprint=17735KB,Allowed Footprint=17735KB,Trimmed=1408KB\n01-14 21:08:27.972: E/GraphicsJNI(26585): VM won\'t let us allocate 2529792 bytes\n01-14 21:08:27.972: D/dalvikvm(26585): GC_FOR_MALLOC已释放39K,剩余内存24%,13615K/17735K,外部内存14641K/16689K,暂停96毫秒\n01-14 21:08:28.092: D/dalvikvm(26585): GC_EXTERNAL_ALLOC已释放40K,剩余内存24%,13579K/17735K,外部内存14641K/16689K,暂停102毫秒\n01-14 21:08:28.212: D/dalvikvm(26585): GC_EXTERNAL_ALLOC已释放41K,剩余内存24%,13574K/17735K,外部内存14641K/16689K,暂停103毫秒\n01-14 21:08:28.212: W/dalvikvm(26585): 线程id=17:线程退出时发生未捕获的异常(组=0x4001d5a0)\n01-14 21:08:28.252: E/dalvikvm-heap(26585): 2529792字节的外部分配对于此进程过大。\n01-14 21:08:28.252: E/dalvikvm(26585): 内存不足:Heap Size=17735KB,已分配=13585KB,Bitmap Size=13902KB,Limit=32768KB\n01-14 21:08:28.252: E/dalvikvm(26585): Trim info: Footprint=17735KB,Allowed Footprint=17735KB,Trimmed=1468KB\n01-14 21:08:28.352: E/GraphicsJNI(26585): VM won\'t let us allocate 2529792 bytes\n有人能帮我吗?谢谢。

0
0 Comments

问题:VM won't let us allocate ** bytes

原因:可能是由于内存不足导致的问题。

解决方法:

1. 在Manifest.xml文件中尝试添加android:largeHeap="true",以增加应用程序的堆内存大小。

2. 如果涉及到位图处理,可以使用BitmapOptions进行处理。可以参考以下代码:

private Bitmap getBitmap(String path) {
    Uri uri = getImageUri(path);
    InputStream in = null;
    try {
        final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
        in = mContentResolver.openInputStream(uri);
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(in, null, o);
        in.close();
        int scale = 1;
        while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) > IMAGE_MAX_SIZE) {
            scale++;
        }
        Log.d(TAG, "scale = " + scale + ", orig-width: " + o.outWidth + ", orig-height: " + o.outHeight);
        Bitmap b = null;
        in = mContentResolver.openInputStream(uri);
        if (scale > 1) {
            scale--;
            // scale to max possible inSampleSize that still yields an image
            // larger than target
            o = new BitmapFactory.Options();
            o.inSampleSize = scale;
            b = BitmapFactory.decodeStream(in, null, o);
            // resize to desired dimensions
            int height = b.getHeight();
            int width = b.getWidth();
            Log.d(TAG, "1th scale operation dimenions - width: " + width + ", height: " + height);
            double y = Math.sqrt(IMAGE_MAX_SIZE / (((double) width) / height));
            double x = (y / height) * width;
            Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x, (int) y, true);
            b.recycle();
            b = scaledBitmap;
            System.gc();
        } else {
            b = BitmapFactory.decodeStream(in);
        }
        in.close();
        Log.d(TAG, "bitmap size - width: " +b.getWidth() + ", height: " + b.getHeight());
        return b;
    } catch (IOException e) {
        Log.e(TAG, e.getMessage(),e);
        return null;
    }
}

以上是关于解决"VM won't let us allocate ** bytes"问题的原因和解决方法。

0