J'ai vu de nombreuses réponses Android suggérant d'appeler le garbage collector dans certaines situations.
Est-ce une bonne pratique de demander le ramasse-miettes dans Android avant d'effectuer une opération gourmande en mémoire? Sinon, dois-je l'appeler uniquement si j'obtiens une OutOfMemory
erreur?
Y a-t-il d'autres choses que je devrais utiliser avant de recourir au garbage collector?
la source
De manière générale, en présence d'un garbage collector, il n'est jamais bon d'appeler manuellement le GC. Un GC est organisé autour d'algorithmes heuristiques qui fonctionnent le mieux lorsqu'ils sont laissés à eux-mêmes. L'appel manuel du GC diminue souvent les performances.
Parfois , dans certaines situations relativement rares, on peut constater qu'un GC particulier se trompe, et un appel manuel au GC peut alors améliorer les choses, en termes de performances. En effet, il n'est pas vraiment possible de mettre en œuvre un GC "parfait" qui gérera la mémoire de manière optimale dans tous les cas. De telles situations sont difficiles à prévoir et dépendent de nombreux détails subtils de mise en œuvre. La «bonne pratique» est de laisser le GC fonctionner seul; un appel manuel au GC est l'exception, qui ne devrait être envisagée qu'après qu'un problème de performance réel a été dûment constaté.
la source
Bitmap.finalize()
méthodes qui libèrent la mémoire non-VM). Par conséquent , dans ce cas, vous devriez aller au- dessus de la tête du GC et exécuterBitmap.recycle()
ou leSystem.gc()
cas échéant. Mais seulement pré-nid d'abeille.La mémoire insuffisante dans l'application Android est très courante si nous ne gérons pas correctement le bitmap, la solution au problème serait
Dans le code ci-dessus, je viens d'essayer de recycler le bitmap, ce qui vous permettra de libérer de l'espace mémoire utilisé, de sorte que la mémoire insuffisante peut ne pas se produire.J'ai essayé cela a fonctionné pour moi.
Si le problème persiste, vous pouvez également ajouter ces lignes
pour plus d'informations, consultez ce lien
https://web.archive.org/web/20140514092802/http://voices.yahoo.com/android-virtual-machine-vm-out-memory-error-7342266.html?cat=59
REMARQUE: en raison de la "pause" momentanée provoquée par l'exécution de gc, il n'est pas recommandé de le faire avant chaque allocation de bitmap.
La conception optimale est:
Libérez tous les bitmaps qui ne sont plus nécessaires , par le
if / recycle / null
code affiché. (Faites une méthode pour vous aider.)System.gc();
Attribuez les nouveaux bitmaps.
la source
Si vous obtenez une OutOfMemoryError, il est généralement trop tard pour appeler le garbage collector ...
Voici une citation du développeur Android:
Donc, à ma connaissance, il n'y a aucun besoin urgent d'appeler le gc. Il est préférable de consacrer plus d'efforts à éviter la création inutile d'objets (comme la création d'objets à l'intérieur de boucles)
la source
Il semble
System.gc()
ne pas fonctionner sur Art Android 6.0.1 Nexus 5x, donc je l'utilise à laRuntime.getRuntime().gc();
place.la source
System.gc()
est une fonction wrapper pourRuntime.getRuntime().gc()
. Voir android.googlesource.com/platform/libcore/+/…System.gc()
cela ne fonctionne pas pour moi, maisRuntime.getRuntime().gc()
ça fonctionne!Mon application gère beaucoup d'images et elle est morte avec une OutOfMemoryError. Cela m'a aidé. Dans le Manifest.xml, ajoutez
la source
De manière générale, vous ne devez pas appeler GC explicitement avec System.gc (). Il y a même la conférence IO ( http://www.youtube.com/watch?v=_CruQY55HOk ) où ils expliquent ce que signifie le journal des pauses du GC et dans lequel ils déclarent également ne jamais appeler System.gc () car Dalvik sait mieux que vous quand le faire.
D'autre part, comme mentionné dans les réponses ci-dessus, le processus GC sous Android (comme tout le reste) est parfois bogué. Cela signifie que les algorithmes de Dalvik GC ne sont pas à égalité avec les JVM Hotspot ou JRockit et peuvent parfois se tromper. L'une de ces occasions est lors de l'allocation d'objets bitmap. C'est une question délicate car elle utilise la mémoire Heap et Non Heap et parce qu'une instance lâche d'objet bitmap sur un périphérique à mémoire limitée suffit à vous donner une exception OutOfMemory. Donc, l'appeler après que vous n'ayez plus besoin de ce bitmap est généralement suggéré par de nombreux développeurs et est même considéré comme une bonne pratique par certaines personnes.
Une meilleure pratique consiste à utiliser .recycle () sur un bitmap car c'est pour cela que cette méthode est faite, car elle marque la mémoire native du bitmap comme sûre à supprimer. Gardez à l'esprit que cela dépend beaucoup de la version, ce qui signifie qu'il sera généralement requis sur les anciennes versions d'Android (Pre 3.0 je pense) mais ne sera pas requis sur les versions ultérieures. De plus, cela ne fera pas beaucoup de mal de l'utiliser sur les versions plus récentes ether (ne faites pas cela en boucle ou quelque chose comme ça). Le nouveau runtime ART a beaucoup changé ici car ils ont introduit une "partition" spéciale pour les gros objets, mais je pense que cela ne fera pas beaucoup de mal de faire cela avec ART éther.
Aussi une note très importante sur System.gc (). Cette méthode n'est pas une commande à laquelle Dalvik (ou les JVM) sont obligés de répondre. Considérez cela plus comme dire à la machine virtuelle "Pourriez-vous s'il vous plaît faire un ramassage des ordures si ce n'est pas un problème".
la source
Meilleur moyen d'éviter le MOO lors de la création de Bitmap,
http://developer.android.com/training/displaying-bitmaps/index.html
la source
Je dirais non, car les documents du développeur sur l' état d' utilisation de la RAM :
J'ai mis en évidence la partie pertinente en gras.
Jetez un œil à la série YouTube, Android Performance Patterns - elle vous montrera des conseils sur la gestion de l'utilisation de la mémoire de votre application (comme l'utilisation des
ArrayMap
s etSparseArray
s d' Android au lieu deHashMap
s).la source
Note rapide pour les développeurs Xamarin .
Si vous souhaitez appeler
System.gc()
dans les applications Xamarin.Android, vous devez appelerJava.Lang.JavaSystem.Gc()
la source
Il n'est pas nécessaire d'appeler le garbage collector après un fichier
OutOfMemoryError
.C'est Javadoc déclare clairement:
Ainsi, le garbage collector a déjà essayé de libérer de la mémoire avant de générer l'erreur, mais n'a pas réussi.
la source