it-swarm-ru.tech

Что означают 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
63
Randy Sugianto 'Yuku'

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

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

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

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

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

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

122
Robert

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

Примерно через 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

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

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

Время паузы

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

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

36
jfritz42

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