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

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

Qu'est-ce qu'ils veulent dire, sachant que ceux-ci peuvent nous aider à faire de meilleures allocations de mémoire.

  • Comment faire référence à un fichier dans un dossier brut dans Android
  • Ordre de rendu incorrect pour le bouton lorsque le thème matériel est appliqué
  • Authentification automatique pour Android WiFi Direct
  • Gradle n'a pas pu trouver com.android.databinding: dataBinder: 1.0-rc0
  • Android: ToggleButton Listener
  • Android Draw9patch lance NoClassDefFoundError
  • 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 

  • Modification des onglets ActionBar soulignent la couleur par programme
  • ViewPager of Fragment ne montre pas son contenu lorsque le fragment de racine est remplacé à nouveau
  • Puis-je construire toutes mes saveurs de gradle à la fois?
  • Google Play Game Services - impossible de se connecter
  • Le mot de passe Keystore de Java est-il inutile?
  • Comment utiliser la fonction onBlur sur EditText dans Android?
  • 3 Solutions collect form web for “Que signifient GC_FOR_MALLOC, GC_EXPLICIT et autres GC_ * dans Android Logcat?”

    GC_FOR_MALLOC signifie que le GC a été déclenché car il n'y avait plus de mémoire sur le tas pour effectuer une allocation. Peut être déclenché lorsque de nouveaux objets sont créés.

    GC_EXPLICIT signifie que le collecteur d'ordures a été explicitement demandé à collecter, au lieu d'être déclenché par des marques d'eau élevées dans le tas. Atteint partout, mais très probablement lorsqu'un fil est en train d'être tué ou lorsqu'une communication de classeur est retirée.

    Il y en a quelques autres aussi:

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

    GC_EXTERNAL_ALLOC signifie que la machine virtuelle essaie de réduire la quantité de mémoire utilisée pour les objets collectables, afin de laisser place à des objets non collectables.

    Mise à jour: Il y a eu un changement de nom du premier événement dans les versions ultérieures d'Android. C'est maintenant appelé "GC_FOR_ALLOC". Il existe également un nouvel événement disponible, bien que très rare dans les téléphones modernes: GC_BEFORE_OOM signifie que le système fonctionne très bas sur la mémoire, et qu'il y a un GC final, afin d'éviter d'appeler le tueur de mémoire faible.

    Un autre endroit où les messages de collecte de déchets Dalvik sont expliqués est dans cette vidéo: Google I / O 2011: gestion de la mémoire pour les applications Android

    À environ 14 minutes de la présentation, il décompose le format du message. (BTW, cette vidéo a 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 la signification de ces.

    Montant libéré

    Par exemple, freed 2125K

    Auto-explicatif

    Statistiques du tas

    Par exemple 47% free 6214K/11719K

    Ces chiffres reflètent les conditions après la sortie du GC. Le "47% gratuit" et 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 croître / se rétrécir, donc vous n'aurez pas nécessairement un OutOfMemoryError si vous appuyez sur cette limite.

    Statistiques de mémoire externe

    Exemple external 7142K/8400K

    Remarque: Cela peut exister uniquement dans les versions avant-nid d'abeille d'Android (pré 3.0).

    Avant Honeycomb, les bitmaps sont attribués externes à votre machine virtuelle (par exemple, Bitmap.createBitmap () affecte le bitmap à l'extérieur et n'attribue que 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 de GC simultané, il y aura deux fois la liste. L'un est pour une pause avant le GC, l'un est pour une pause lorsque le GC est en grande partie terminé. Eg a paused 3ms+5ms

    Pour les événements GC non concurrents, il n'y a qu'un seul temps de pause et il est généralement beaucoup plus grand. Eg paused 87ms

    J'ai également trouvé ceci 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; 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.