web-dev-qa-db-fra.com

Que signifient GC_FOR_MALLOC, GC_EXPLICIT et autres GC_ * dans Android Logcat?

Si vous voyez les journaux Android Android, vous pouvez voir beaucoup de ces choses.

Que signifient-ils, sachant que ceux-ci peuvent nous aider à faire de meilleures allocations de mémoire.

Exemple:

 28470               dalvikvm  D  GC_FOR_MALLOC freed 665 objects / 239992 bytes in 71ms
 28470               dalvikvm  D  GC_FOR_MALLOC freed 673 objects / 240288 bytes in 87ms
 21940               dalvikvm  D  GC_EXPLICIT freed 4802 objects / 185320 bytes in 78ms
 28470               dalvikvm  D  GC_FOR_MALLOC freed 666 objects / 240536 bytes in 63ms
63
Randy Sugianto 'Yuku'

GC_FOR_MALLOC signifie que le GC a été déclenché car il n'y avait pas assez de mémoire sur le tas pour effectuer une allocation. Peut être déclenché lors de la création de nouveaux objets.

GC_EXPLICIT signifie que le ramasse-miettes a été explicitement invité à collecter, au lieu d'être déclenché par les hautes marques d'eau dans le tas. Cela se produit partout, mais très probablement lorsqu'un thread est en cours de suppression ou lorsqu'une communication de classeur est interrompue.

Il y en a aussi quelques autres:

GC_CONCURRENT Déclenché lorsque le tas a atteint une certaine quantité d'objets à collecter.

GC_EXTERNAL_ALLOC signifie que le VM essaie de réduire la quantité de mémoire utilisée pour les objets collectables, pour faire de la place pour plus de non collectables.

pdate: Il y a eu un changement de nom du premier événement dans les versions ultérieures d'Android. Il s'appelle désormais "GC_FOR_ALLOC". Un nouvel événement est également disponible, bien que très rare dans les téléphones modernes: GC_BEFORE_OOM signifie que le système fonctionne très peu en mémoire et qu'un GC final est effectué, afin d'éviter d'appeler le bas tueur de mémoire.

122
Robert

Un autre endroit où les messages du récupérateur de déchets Dalvik sont expliqués est dans cette vidéo: Google I/O 2011: Gestion de la mémoire pour Android Apps

À environ 14 minutes de la présentation, il décompose le format du message. (BTW, cette vidéo contient de très bonnes informations sur le débogage des fuites de mémoire)

En gros, le format est [Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

Raison

Robert/yuku a déjà donné des informations sur leur signification.

Montant libéré

Par exemple. freed 2125K

Explicite

Statistiques de tas

Par exemple. 47% free 6214K/11719K

Ces chiffres reflètent les conditions après l'exécution du GC. Le "47% gratuit" et le 6214K reflètent l'utilisation actuelle du tas. Le 11719K représente la taille totale du tas. D'après ce que je peux dire, le tas peut grandir/rétrécir, donc vous n'aurez pas nécessairement une OutOfMemoryError si vous atteignez cette limite.

Statistiques de mémoire externe

Par exemple external 7142K/8400K

Remarque: Cela peut exister uniquement dans les versions antérieures à Honeycomb de Android (pré 3.0).

Avant Honeycomb, les bitmaps sont alloués en externe à votre VM (par exemple, Bitmap.createBitmap () alloue le bitmap en externe et alloue seulement quelques dizaines d'octets sur votre tas local). D'autres exemples d'allocations externes sont pour Java.nio.ByteBuffers.

Le temps de pause

S'il s'agit d'un événement GC simultané, il y en aura deux fois. L'un est pour une pause avant le GC, l'autre pour une pause lorsque le GC est presque terminé. Par exemple. paused 3ms+5ms

Pour les événements GC non simultanés, il n'y a qu'un seul temps de pause et il est généralement beaucoup plus long. Par exemple. paused 87ms

36
jfritz42

J'ai également trouvé cela dans les sources Android, dalvik/vm/alloc/Heap.h . Que cela soit utile.

typedef enum {
    /* Not enough space for an "ordinary" Object to be allocated. */
    GC_FOR_MALLOC,
    /* Automatic GC triggered by exceeding a heap occupancy threshold. */
    GC_CONCURRENT,
    /* Explicit GC via Runtime.gc(), VMRuntime.gc(), or SIGUSR1. */
    GC_EXPLICIT,
    /* GC to try to reduce heap footprint to allow more non-GC'ed memory. */
    GC_EXTERNAL_ALLOC,
    /* GC to dump heap contents to a file, only used under WITH_HPROF */
    GC_HPROF_DUMP_HEAP
} GcReason;
27