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