J’enquête actuellement sur des problèmes de ramassage des ordures avec mon application Android et je suis curieux de savoir si GC_FOR_ALLOC indique un problème plus grave que d’autres messages du GC, tels que GC_CONCURRENT.
De ma compréhension, GC_CONCURRENT fait ce que le ramasse-miettes doit faire. Le tas a atteint une limite particulière, mieux vaut nettoyer la mémoire.
GC_FOR_ALLOC me suggère que quelque chose de plus grave se produit si j’essaie de créer un object et qu’il ne rest plus de mémoire pour le faire.
Existe-t-il une priorité ou un niveau de «gravité» pour les messages du GC?
Dans un sens, GC_FOR_ALLOC
est plus grave que GC_CONCURRENT
, car GC_FOR_ALLOC
signifie qu’il n’y avait pas assez de mémoire disponible pour répondre à une demande d’allocation. Un garbage collection était donc nécessaire. la mémoire est devenue inférieure à un certain seuil après une allocation.
Un GC_FOR_ALLOC
n’est pas en soi un signe de problème dans votre application, cependant:
GC_FOR_ALLOC
est effectué avant d’augmenter la taille du tas. Dans ce cas, GC_FOR_ALLOC
est parfaitement normal. GC_FOR_ALLOC
est inévitable. Et il n’y a rien de mal à allouer de la mémoire plus rapidement que le GC simultané ne peut libérer de la mémoire. GC_BEFORE_OOM
est un type de GC plus sérieux sur Android, qui est exécuté lorsqu’une demande d’allocation échoue même après GC_FOR_ALLOC
et lorsque le GC_FOR_ALLOC
application a atteint la taille GC_FOR_ALLOC
autorisée. Lorsque cela se produit, Dalvik essaiera également de libérer SoftReferences avant de tenter une dernière fois d’allouer de la mémoire. Si cela échoue, émettez une exception OutOfMemory.
Si vous êtes curieux de voir le code de cette logique, vous le tryMalloc()
dans tryMalloc()
dans dalvik.git / vm / alloc / Heap.cpp
Quoi qu’il en soit, si vous le permettez, je doute que le fait de regarder la sortie logcat soit le moyen le plus efficace de déboguer vos problèmes de récupération de place. Je ne sais pas quel problème spécifique vous rencontrez, mais avez-vous déjà examiné des outils tels que le hprof-conv
allocation dans DDMS et analysé les hprof-conv
à l’aide de l’outil hprof-conv
? (Voir http://android-developers.blogspot.se/2011/03/memory-analysis-for-android.html pour commencer, par exemple.)