Android:java.lang.OutOfMemoryError: N'a pas attribué d'attribution de byte 23970828 avec 2097152 octets gratuits et 2MB jusqu'à OOM

je veux montrer le Bitmap image dans ImageView de la carte sd qui est déjà stocké. Après l'exécution, mon application est crash et obtenir OutOfMemoryError erreur de:

(java.lang.OutOfMemoryError: N'a pas attribué d'attribution de byte 23970828 avec 2097152 octets gratuits et 2MB jusqu'à OOM)

je n'ai aucune idée ou pourquoi sa mémoire. Je je pense que ma taille d'image est très grande, alors j'ai essayé de la changer.

Iterator<String> it = imageArray.iterator();
while (it.hasNext()) {
  Object element = it.next();
  String objElement = element.toString();
  Log.e("objElement ", " = " + objElement);
  final ImageView imageView = new ImageView (getContext());
  final ProgressBar pBar = new ProgressBar(getContext(), null, 
                                           android.R.attr.progressBarStyleSmall);
  imageView.setTag(it);
  pBar.setTag(it);

  imageView.setImageResource(R.drawable.img_placeholder);
  pBar.setVisibility(View.VISIBLE);

  if (objElement.endsWith(mp3_Pattern)) {
     Log.e("Mp3 ", " ends with ");
     pBar.setVisibility(View.GONE);
     imageView.setImageResource(R.drawable.audio_control);
  }
  if (objElement.endsWith(png_Pattern)) {
     Bitmap bitmap = BitmapFactory.decodeFile(objElement);
     int size = Math.min(bitmap.getWidth(), bitmap.getHeight());
     int x = (bitmap.getWidth() - size) / 2;
     int y = (bitmap.getHeight() - size) / 2;
     Bitmap bitmap_Resul = Bitmap.createBitmap(bitmap, x, y, size, size);
     Log.e("bitmap_Resul "," = "+ bitmap_Resul);

     if (bitmap_Resul != bitmap) {
        bitmap.recycle();
     }
     imageView.setImageBitmap(bitmap_Resul);
     Log.e("png_Pattern ", " ends with ");
     Log.e(" bitmap "," = " + bitmap);
  }

  holder.linearLayout.addView(imageView);
  holder.linearLayout.addView(pBar);

Le journal d'information de chat:

08-27 14:11:15.307    1857-1857/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.tazeen.classnkk, PID: 1857
    java.lang.OutOfMemoryError: Failed to allocate a 23970828 byte allocation with 2097152 free bytes and 2MB until OOM
            at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
            at android.graphics.Bitmap.nativeCreate(Native Method)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:812)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:789)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:709)
            at android.graphics.Bitmap.createBitmap(Bitmap.java:634)
            at com.example.tazeen.classnkk.AllPosts_Page$MyListAdapter.getView(AllPosts_Page.java:357)
            at android.widget.AbsListView.obtainView(AbsListView.java:2347)
            at android.widget.ListView.makeAndAddView(ListView.java:1864)
            at android.widget.ListView.fillDown(ListView.java:698)
            at android.widget.ListView.fillFromTop(ListView.java:759)
            at android.widget.ListView.layoutChildren(ListView.java:1659)
            at android.widget.AbsListView.onLayout(AbsListView.java:2151)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
            at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
            at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
            at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
            at android.view.View.layout(View.java:15671)
            at android.view.ViewGroup.layout(ViewGroup.java:5038)
            at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
230
demandé sur Cœur 2015-08-27 11:55:27

24 réponses

OutOfMemoryError est le problème le plus commun qui se produit dans android tout particulièrement traitant bitmaps. Cette erreur est générée par la machine virtuelle Java (JVM) lorsqu'un objet ne peut pas être attribué en raison d'un manque d'espace mémoire et que le collecteur de déchets ne peut pas libérer de l'espace.

comme mentionné par Aleksey, vous pouvez ajouter ci-dessous des entités dans votre fichier de manifestes android:hardwareAccelerated="false" , android:largeHeap="true" il fonctionnera pour certains environnement.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

vous devriez certainement lire certains des concepts de développeur androïdes, spécialement ici: affichage de Bitmaps efficacement

lisez tous les 5 sujets et réécrivez votre code à nouveau. Si cela ne fonctionne toujours pas, nous serons heureux de voir ce que vous avez fait de mal avec le matériel du tutoriel.

voici quelques réponses possibles pour ce type d'erreurs dans SOF

Android: BitmapFactory.decodeStream() de la mémoire avec une 400KB fichier avec 2 mo de libre tas

Comment résoudre java.lang.OutOfMemoryError de la difficulté à Android

Android: java.lang.OutOfMemoryError

de java.lang.OutOfMemoryError

Solution pour OutOfMemoryError: bitmap size exceeds VM budget

éditer: des commentaires de @cjnash

pour ceux qui ont encore des plantages après avoir ajouté cette ligne, essayez de coller votre image dans votre res/drawable-xhdpi/ folder au lieu de votre res/drawable/ et cela pourrait résoudre votre problème.

352
répondu King of Masses 2017-09-20 03:57:39

avez-vous essayé d'ajouter ceci à votre manifeste sous demandes? android:largeHeap="true" ?

comme ceci

  <application
      android:name=".ParaseApplication"
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme"
      android:largeHeap="true" >
72
répondu TSG 2016-11-19 06:47:05

en fait, vous pouvez ajouter dans votre manifeste ces lignes android:hardwareAccelerated="false" , android:largeHeap="true" cela fonctionne pour certaines situations, mais soyez conscient que l'autre partie du code peut argumenter avec cela.

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
24
répondu Aleksey Timoshchenko 2016-10-03 05:49:20

Pour moi, le problème était que mon .le fichier png était en cours de décompression pour être un bitmap vraiment énorme en mémoire, parce que l'image avait de très grandes dimensions (même si la taille du fichier était minuscule).

donc le correctif était simplement de redimensionner l'image:)

18
répondu petrus-jvrensburg 2016-02-06 14:19:55

ça devrait marcher

 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inSampleSize = 8;

 mBitmapInsurance = BitmapFactory.decodeFile(mCurrentPhotoPath,options);
14
répondu Akshay komarla 2016-07-25 08:38:06

redimensionner votre image avant de configurer ImageView comme ceci:

Bitmap.createScaledBitmap(_yourImageBitmap, _size, _size, false);

où la taille est la taille réelle D'ImageView. Vous pouvez atteindre la taille en mesurant:

imageView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

et utiliser la taille suivante imageView.getMeasuredWidth() et imageView.getMeasuredHeight() pour scaling .

8
répondu Vladimir Eremeev 2017-02-08 18:37:27

utiliser bibliothèque de plané et outrepasser la taille à une taille inférieure;

Glide.with(mContext).load(imgID).asBitmap().override(1080, 600).into(mImageView);
6
répondu Mahdi Azadbar 2017-01-20 20:16:35

j'ai résolu ce problème en redimensionnant l'image à une taille inférieure. Je suis à l'aide de xamarin forme. la diminution de la taille de L'image PNG a résolu le problème.

4
répondu maxspan 2016-05-02 20:41:53

j'ai eu d'erreur ci-dessous

"e / art: jeter OutOfMemoryError" N'a pas attribué un byte 47251468 attribution avec 16777120 octets gratuits et 23MB jusqu'à 151930920"

après l'ajout de android:largeHeap="true" dans AndroidManifest.xml puis je débarrasse de toutes les erreurs

<application
    android:allowBackup="true"
    android:icon="@mipmap/guruji"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:largeHeap="true"
    android:theme="@style/AppTheme">
3
répondu saigopi 2017-02-06 21:34:00

Soluton essayez ceci dans votre fichier de manifeste et utilisez la bibliothèque Glide

compiler", com.github.bumptech.glide:la glisse:3.7.0'

    **Use Glide Library and Override size to less size;**

 if (!TextUtils.isEmpty(message.getPicture())) {
            Glide.with(mContext).load(message.getPicture())
                    .thumbnail(0.5f)
                    .crossFade()
                    .transform(new CircleTransform(mContext))
                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                    .into(holder.imgProfile);
        } 

android: hardwareAccelerated= "false"

android: largeHeap= "true"

<application
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

utiliser cette bibliothèque

  compile 'com.github.bumptech.glide:glide:3.7.0'   

Son Travail De Codage Heureux

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;

import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;


public class CircleTransform extends BitmapTransformation {
    public CircleTransform(Context context) {
        super(context);
    }

    @Override
    protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
        return circleCrop(pool, toTransform);
    }

    private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
        if (source == null) return null;

        int size = Math.min(source.getWidth(), source.getHeight());
        int x = (source.getWidth() - size) / 2;
        int y = (source.getHeight() - size) / 2;

        // TODO this could be acquired from the pool too
        Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

        Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
        if (result == null) {
            result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(result);
        Paint paint = new Paint();
        paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
        paint.setAntiAlias(true);
        float r = size / 2f;
        canvas.drawCircle(r, r, r, paint);
        return result;
    }

    @Override
    public String getId() {
        return getClass().getName();
    }
}
3
répondu Keshav Gera 2017-08-15 17:57:16

question: N'a pas attribué une attribution de byte 37748748 avec 16777120 octets gratuits et 17 Mo jusqu'à 151940920"

Solution : 1.ouvrir votre fichier manifest 2. à l'intérieur de l'étiquette d'application juste Ajouter ci-dessous deux lignes

 android:hardwareAccelerated="false"
 android:largeHeap="true"

exemple:

 <application
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:largeHeap="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
3
répondu Kishore Reddy 2017-11-06 11:28:50

j'ai eu le problème aussi.

idem avec la plupart des autres ci-dessus. Le problème est causé par l'image énorme.

il suffit de redimensionner quelques images, et pas besoin de changer le code.

2
répondu Mike Yan 2017-03-09 02:26:06

je suis un débutant dans android en développement, mais j'espère que ma solution aide, il fonctionne à ma condition parfaitement. Im utilisant Imageview et mettre son arrière-plan à " src " parce que im essayant de faire une animation de cadre. J'ai eu la même erreur, mais quand j'ai essayé de coder ça, ça a marché

int ImageID = this.Resources.GetIdentifier(questionPlay[index].Image.ToLower(), "anim", PackageName);
            imgView.SetImageResource(ImageID);
            AnimationDrawable animation = (AnimationDrawable)imgView.Drawable;
            animation.Start();
            animation.Dispose();
1
répondu DianeFlores 2017-02-26 08:24:56

Dans certains cas (par exemple, des opérations dans une boucle) garbage collector est plus lent de votre code. Vous pouvez utiliser une méthode d'aide de cette réponse à wait for garbage collector .

1
répondu Zon 2017-06-20 06:06:45

j'ai rencontré ce problème lorsque je n'ai pas tué mon ancienne activité au moment de passer à une nouvelle activité. Je l'ai fixé avec finish();

    Intent goToMain = new Intent(this,MainActivity.class);
    startActivity(goToMain);
    finish();
1
répondu Jason Hu 2017-07-03 17:36:15

cela a fonctionné pour moi: il suffit de déplacer les images du dossier dessinable à-HDPI dessinable.

1
répondu Hossein Amini 2017-08-14 14:58:11
Bitmap image =((BitmapDrawable)imageView1.getDrawable()).getBitmap();

ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();

image.compress(Bitmap.CompressFormat.JPEG,50/100,byteArrayOutputStream);

50/100 si on utilise 100 alors la résolution originale peut arrêter les applications pour hors de la mémoire.

si 50 ou moins de 100 ce sera de 50% ou moins de 100 résolution afin de prévenir de la sortie de problème de mémoire

1
répondu RAHINUR RAHMAN 2017-11-06 11:29:26

j'ai trouvé que les images dans le dossier 'drawable' seront converties en une image beaucoup plus grande sur les téléphones high def. Par exemple, une image de 200k sera rééchantillonnée à une plus haute résolution, comme 800k ou 32000k. J'ai dû le découvrir par moi-même et jusqu'à présent je n'ai pas vu de documentation pour ce piège de mémoire tas. Pour éviter cela, je mets tout dans un dossier-nodpi dessinable (en plus d'utiliser 'options' dans BitmapFactory basé sur le périphérique particulier tas). Je ne peux pas me permettre d'avoir la taille de mon application gonflé avec plusieurs dossiers à dessiner, en particulier que la gamme de défs d'écran est si vaste maintenant. Ce qui est délicat, c'est que studio n'indique plus le dossier 'drawable-nodpi' en tant que tel dans la vue projet, il n'affiche qu'un dossier 'drawable'. Si vous ne faites pas attention, quand vous déposez une image dans ce dossier dans studio, elle ne sera pas réellement déposée dans le drawable-nodpi:

Careful here 'backgroundtest' did not actually go to drawable-nodpi and will 
be resampled higher, such as 4x or 16x of the original dimensions for high def screens.

enter image description here

Assurez-vous de cliquer vers le bas dans le dossier nodpi dans le dialogue, car la vue de projet ne vous montrera pas tous les dossiers dessinables séparément comme il le faisait, de sorte qu'il ne sera pas immédiatement évident qu'il est allé à la mauvaise. Studio a recréé le "drawable" vanille à un moment donné pour moi après que je l'ai supprimé il y a longtemps:

enter image description here

1
répondu Androidcoder 2017-11-12 18:50:02

vous devez changer la taille de l'objet dans drawable. Il est trop grand pour androïde à afficher. par exemple, si vous définissez image, essayez image avec moins de pixels. Il fonctionne pour moi. Grâce. :)

1
répondu Ali Hassan Qureshi 2018-01-31 11:29:42

votre application est en panne parce que la taille de votre image (en MB ou KB) est trop grande donc il n'est pas allouer de place pour cela. Donc avant de coller votre image dans drawable il suffit de réduire la taille.

ou

vous pouvez ajouter ce qui suit dans l'étiquette d'application au Manifeste.xml

 android:hardwareAccelerated="false"
    android:largeHeap="true"
    android:allowBackup="true"

après L'ajout de cette application ne se plantera pas.

  • utilisez toujours moins tailles d'images dans L'application.
  • si vous ajoutez de grandes tailles d'images dans l'application , vous devez ajouter au-dessus de syntex, mais la taille de L'application va augmenter.
1
répondu rhaldar 2018-07-23 07:45:48

si vous téléchargez une image, essayez de réduire la qualité de l'image, qui est le deuxième paramètre du Bitmap. C'était la solution dans mon cas. Auparavant c'était 90, puis j'ai essayé avec 60 (comme il est dans le code ci-dessous maintenant).

Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
finalBitmap.compress(Bitmap.CompressFormat.JPEG,60,baos);
byte[] b = baos.toByteArray();
0
répondu Teo Mihaila 2016-07-01 12:39:22

Essayez le plus simple. Peut-être que votre application est en panne parce que votre taille d'image (en MB) est trop grande, donc il n'est pas allouer d'espace pour cela. Donc, avant de coller votre image dans drawable il suffit de réduire la taille de n'importe quel logiciel de visionneuse ou si vous prenez l'image de la galerie à l'heure d'exécution qu'avant de la sauvegarder compressez votre bitmap. Il a travaillé pour moi. certainement pour vous sera.

0
répondu neens 2017-06-18 10:27:57

mon problème résolu après l'ajout de

 dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries true
        dexInProcess = true
    }

dans la construction.Dossier Gradle

0
répondu Midhilaj 2018-08-13 14:16:01
stream = activity.getContentResolver().openInputStream(uri);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;

bitmap = BitmapFactory.decodeStream(stream, null, options);
int Height = bitmap.getHeight();
int Width = bitmap.getWidth();
enter code here
int newHeight = 1000;
float scaleFactor = ((float) newHeight) / Height;
float newWidth = Width * scaleFactor;

float scaleWidth = scaleFactor;
float scaleHeight = scaleFactor;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
resizedBitmap= Bitmap.createBitmap(bitmap, 0, 0,Width, Height, matrix, true);
bitmap.recycle();

puis dans tag application, Ajouter largeheapsize= "true

0
répondu sathish mobapp dev 2018-10-08 04:55:02