110 votes

Garbage collector dans Android

J'ai semblent beaucoup Android réponses qui conseille d'appeler le garbage collector dans certaines situations.

Est-ce une bonne pratique de demander le garbage collector dans Android avant de faire un mémoire-faim opération? Si non, dois-je seulement l'appeler si j'ai une OutOfMemory d'erreur?

Existe-il d'autres choses que je devrais utiliser avant de recourir à la garbage collector?

146voto

steve Points 650

Oui, faire appel System.gc().

J'ai essayé de créer des images bitmap, mais il a été toujours obtenir "VM erreur de mémoire insuffisante". Mais, quand j'ai appelé System.gc() tout d'abord, il a été OK.

Lors de la création d'images bitmap, Android souvent échoue avec des erreurs de mémoire insuffisante, et ne pas essayer de collecter les ordures première. Donc, appelez - System.gc(), et vous avez assez de mémoire pour créer des images bitmap.

Si la création d'Objets, je pense que System.gc sera appelé automatiquement, si nécessaire, mais pas pour la création d'images. Il vient échoue.

Je recommande donc manuellement appelant System.gc() avant de créer des images bitmap.

121voto

Thomas Pornin Points 36984

En règle générale, en présence d'un garbage collector, c'est jamais une bonne pratique manuellement à l'appel de la GC. Un GC est organisé autour des algorithmes heuristiques qui fonctionnent le mieux lorsqu'ils sont laissés à leurs propres moyens. L'appel de la GC manuellement souvent des baisses de performance.

Parfois, dans certains relativement rares situations, on peut constater qu'un particulier GC s'il se trompe, et un manuel de l'appel à la GC peut ensuite améliore les choses, en terme de performance. C'est parce qu'il n'est pas vraiment possible de mettre en œuvre un "parfait" GC qui va gérer la mémoire de manière optimale dans tous les cas. De telles situations sont difficiles à prévoir et dépendent de beaucoup de subtils détails de mise en œuvre. La "bonne pratique" est de laisser le GC exécuter par lui-même; un manuel de l'appel à la GC est l'exception, ce qui devrait être envisagée qu'après un réel problème de performance a été dûment été témoin.

27voto

user1389238 Points 86

L'espace mémoire de l'application android est très commun, si nous avons pas gérer le bitmap correctement, La solution pour le problème serait

System.gc();
if(imageBitmap != null) {
     imageBitmap.recycle();
     imageBitmap = null;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 3;
imageBitmap = BitmapFactory.decodeFile(URI, options);
Bitmap  scaledBitmap = Bitmap.createScaledBitmap(imageBitmap, 200, 200, true);
imageView.setImageBitmap(scaledBitmap);

Dans le code ci-dessus Ont juste essayé de recycler l'image bitmap qui vous permettra de libérer de la mémoire utilisée ,donc hors de la mémoire peut ne pas se produire.Je l'ai essayé, il a travaillé pour moi.

Si encore face à ce problème, vous pouvez également ajouter ces lignes

BitmapFactory.Options options = new BitmapFactory.Options();
options.inTempStorage = new byte[16*1024];
options.inPurgeable = true;

pour plus d'informations, jetez un oeil à ce lien

http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html

  • Heureux de programmation ;)

20voto

Andreas_D Points 64111

Si vous obtenez une OutOfMemoryError alors que c'est généralement trop tard pour appeler le garbage collector...

Voici la citation de Développeur Android:

La plupart du temps, la collecte des ordures se produit parce que des tonnes de petits, courte durée de vie des objets et des ordures collectionneurs, comme générationnelle des ordures les collectionneurs, peuvent optimiser l' la collecte de ces objets ainsi que l'application n'a pas obtenir de l' interrompue trop souvent. Android garbage collector n'est malheureusement pas en mesure d'effectuer de telles optimisations et la création d'objets éphémères dans critique pour les performances chemins de code est donc très coûteux pour votre application.

Donc, à ma connaissance, il n'y a pas d'urgence à appeler la gc. Il est préférable de consacrer davantage d'efforts à éviter la création inutile d'objets (comme la création d'objets à l'intérieur des boucles)

7voto

Klykoo Points 31

Mon application est de gérer beaucoup d'images et il est mort avec un OutOfMemoryError. Cela m'a aidé. Dans le Manifest.xml Ajouter

<application
....
   android:largeHeap="true"> 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X