63 votes

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

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

Que signifient-ils, sachant que ces informations peuvent nous aider à optimiser les 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
 

122voto

Robert Points 3903

GC_FOR_MALLOC signifie que le GC a été déclenchée car il n'y avait pas assez de mémoire sur le tas à effectuer une répartition. Peut-être déclenché lorsque de nouveaux objets sont créés.

GC_EXPLICIT signifie que le garbage collector a été explicitement demandé de recueillir, au lieu d'être déclenchées par des traces d'eau dans le tas. Arrive tout le temps, mais le plus probable lorsqu'un thread est en train d'être tués ou lorsqu'un classeur de communication est prise vers le bas.

Il y a quelques autres:

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

GC_EXTERNAL_ALLOC signifie que la machine virtuelle est en train d'essayer de réduire la quantité de mémoire utilisée pour collectionner des objets, pour faire de la place pour plus de non-recouvrables.

Mise à jour: Il y a eu un changement de nom de la première manifestation dans les versions ultérieures d'Android. Il s'appelle maintenant "GC_FOR_ALLOC". Il y a aussi une nouvelle manifestation est disponible, bien que très rare dans les téléphones modernes: GC_BEFORE_OOM signifie que le système est en cours d'exécution très faible sur la mémoire, et qu'il y a une finale de GC effectuée, afin d'éviter d'appeler le peu de mémoire de tueur.

36voto

jfritz42 Points 2890

Un autre endroit où le Dalvik garbage collector messages est expliqué dans cette vidéo: Google I/O 2011: gestion de la Mémoire pour les Applications Android

À environ 14 minutes dans la présentation, il tombe en panne, le format de message. (BTW, cette vidéo a vraiment de bonnes infos sur le débogage des fuites de mémoire)

Grosso modo, le format est - [Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

Raison

Robert/yuku déjà donné des infos sur le sens de ces.

Montant Libéré

E. g. freed 2125K

Auto-explicatif

Tas De Statistiques

E. g. 47% free 6214K/11719K

Ces chiffres reflètent les conditions après la GC a couru. Les "47% gratuit" et 6214K reflètent l'utilisation du tas. Le 11719K représente le total de la taille du segment. À partir de ce que je peux dire, le tas peut grandir/rétrécir, de sorte que vous ne sera pas nécessairement un OutOfMemoryError si vous atteignez cette limite.

Mémoire Externe Statistiques

E. g external 7142K/8400K

Remarque: Ce pourrait n'exister que dans la pré-Nid d'abeille versions d'Android (pré 3.0).

Avant en Nid d'abeille, les bitmaps sont alloués à l'extérieur de votre machine virtuelle (par exemple Bitmap.createBitmap() alloue la bitmap de l'extérieur et n'alloue que quelques dizaines d'octets sur votre tas local). D'autres exemples de externe des allocations pour java.nio.ByteBuffers.

Le Temps De Pause

Si c'est un concurrent à l'GC événement, il y aura deux temps indiqués. On est pour une pause avant que la GC, on est pour une pause lors de la GC se fait le plus souvent. E. g. paused 3ms+5ms

Pour les non-simultanées GC événements, il y a seulement un temps de pause et c'est généralement beaucoup plus grande. E. g. paused 87ms

27voto

yuku Points 15705

J'ai aussi trouvé cela dans les sources Android, dalvik/vm/alloc/Heap.h . Puisse cela être 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;
 

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