Что означают GC_FOR_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

Ответ 1

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

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

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

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

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

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

Ответ 2

Другое место, где объясняются сообщения сборщика мусора 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% свободных" и 6214 тыс. Отражают текущее использование кучи. 11719K представляет общий размер кучи. Из того, что я могу сказать, куча может расти/сокращаться, поэтому вы не обязательно будете иметь OutOfMemoryError, если вы нажмете этот предел.

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

Например, external 7142K/8400K

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

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

Время паузы

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

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

Ответ 3

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