Что означает GC для MALLOC, GC EXPLICIT и других GC * в Android Logcat?



Если вы видите журналы Android, вы можете увидеть много таких вещей.



что они означают, зная, что это может помочь нам сделать лучшее распределение памяти.



пример:



 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
575   3  

3 ответов:

GC_FOR_MALLOC означает, что GC был вызван, потому что в куче осталось недостаточно памяти для выполнения выделения. Может быть вызвано при создании новых объектов.

GC_EXPLICIT означает, что сборщик мусора был явно запрошен для сбора, а не вызван высокими отметками воды в куче. Происходит повсюду, но, скорее всего, когда поток убивается или когда связь с связующим берется вниз.

есть еще несколько других:

GC_CONCURRENT срабатывает, когда куча достигла определенного количества объектов для сбора.

GC_EXTERNAL_ALLOC означает, что виртуальная машина пытается уменьшить объем памяти, используемой для собираемых объектов, чтобы освободить место для более не собираемых.

обновление: произошло изменение имени первого события в более поздних версиях Android. Теперь это называется "GC_FOR_ALLOC". Существует также новое событие доступно, хотя очень редко в современных телефонах: GC_BEFORE_OOM означает, что система работает очень мало памяти, и что есть окончательный GC выполняется, чтобы избежать вызова low memory killer.

еще одно место, где сообщения сборщика мусора Dalvik объясняются в этом видео:Google I / O 2011: управление памятью для Android-приложений

примерно через 14 минут после начала презентации он разбивает формат сообщения. (Кстати, это видео имеет действительно хорошую информацию об отладке утечек памяти)

грубо говоря, формат [Reason] [Amount Freed], [Heap Statistics], [External Memory Statistics], [Pause Time]

причина

Роберт / Юку уже дал информацию о значении эти.

Сумма Освобожденного

например.freed 2125K

пояснений

Куча Статистики

например.47% free 6214K/11719K

эти цифры отражают условия после запуска GC. "47% бесплатно" и 6214K отражают текущее использование кучи. 11719K представляет общий размер кучи. Из того, что я могу сказать, куча может расти/сжиматься, поэтому у вас не обязательно будет OutOfMemoryError, если вы достигнете этого предела.

Внешняя Память Статистика

например external 7142K/8400K

Примечание: это может существовать только в pre-Honeycomb версии Android (pre 3.0).

перед Honeycomb растровые изображения выделяются внешними для вашей виртуальной машины (например, Bitmap.createBitmap () выделяет растровое изображение внешне и только выделяет несколько десятков байт в локальной куче). Другие примеры внешних распределений предназначены для java.НИО.Объектов ByteBuffer.

Пауза Времени

если это параллельное событие GC, будет два время указано. Один-для паузы перед GC, один-для паузы, когда GC в основном делается. Е. Г. paused 3ms+5ms

для неконкурентных событий GC существует только одно время паузы, и обычно оно намного больше. Е. Г. paused 87ms

Я также нашел это в источниках Android,dalvik/vm/alloc/Heap.h. Пусть это будет полезно.

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;

Comments

    Ничего не найдено.