Что означают GC_FOR_MALLOC, GC_EXPLICIT и другие GC_ * в Android Logcat? - PullRequest
63 голосов
/ 12 февраля 2011

Если вы видите журналы 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

Ответы [ 3 ]

122 голосов
/ 12 февраля 2011

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

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

Также есть несколько других:

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

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

Обновление: Произошла смена имени первого события в более поздних версиях Android. Теперь он называется «GC_FOR_ALLOC». Также доступно новое событие, хотя оно очень редко встречается в современных телефонах: GC_BEFORE_OOM означает, что системе действительно не хватает памяти, и что выполняется окончательный GC, чтобы избежать вызова убийцы с низким объемом памяти.

36 голосов
/ 04 августа 2011

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

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

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

Причина

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

Сумма Freed

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

Нет объяснений

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

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

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

Статистика внешней памяти

напр. external 7142K/8400K

Примечание. Это может существовать только в версиях Android, предшествующих Honeycomb (до 3.0).

Перед Honeycomb битовые карты выделяются вне вашей виртуальной машины (например, Bitmap.createBitmap () выделяет битовую карту внешне и выделяет только несколько десятков байтов в вашей локальной куче). Другие примеры внешнего распределения для java.nio.ByteBuffers.

Время паузы

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

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

27 голосов
/ 13 июня 2011

Я также нашел это в источниках 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;
...