Подтвердить что ты не робот

Android-журналы GC_EXTERNAL_ALLOC '' GC_FOR_MALLOC '

При запуске моих приложений у меня есть такие журналы:

GC_EXTERNAL_ALLOC освобожден 2K, 38% бесплатно 8772K/14087K, внешний 17480K/17998K, приостановлено 87ms

GC_FOR_MALLOC освобожден 0K, 38% бесплатно 8772K/14087K, внешний 17480K/17998K, приостановлено 67ms

GC_CONCURRENT освободил 2125K, 47% бесплатно 6214K/11719K, внешний 7142K/8400K, приостановил 3 мс + 5 мс

Кто-нибудь знает, что означают эти журналы? Спасибо заранее!

  • В чем разница между "GC_EXTERNAL_ALLOC", "GC_FOR_MALLOC" и "GC_CONCURRENT". Есть ли какие-то другие "GC" события?
  • Что означает "38% бесплатно 8772K/14087K"? Что такое "8772K" и что такое "14087K"?
  • Что означает "внешний 17480K/17998K"? Что такое "17480K" и что такое "17998K"?

Спасибо!

4b9b3361

Ответ 1

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

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

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

Причина

Виктор/Роберт уже объяснил GC_CONCURRENT, GC_FOR_MALLOC, GC_EXTERNAL_ALLOC.

Существует также:

  • GC_HPROF_DUMP_HEAP - Если вы сбросите кучу, нажав кнопку "Куча дампа" из DDMS или программно

  • GC_EXPLICIT - Если вы вызываете System.gc()

Количество Освобождено

например. 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

Ответ 2

Я также искал эту информацию.

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

    • GC_EXTERNAL_ALLOC: означает, что виртуальная машина пытается уменьшить объем памяти, используемой для коллекционируемых объектов, чтобы освободить место для объектов, не подлежащих сборке.
    • GC_FOR_MALLOC: означает, что GC был вызван, потому что в куче осталось недостаточно памяти для выполнения выделения. Может срабатывать при создании новых объектов.
    • GC_CONCURRENT: запускается, когда куча достигла определенного количества объектов для сбора.
  • Я предполагаю, что 38% свободных означает, что 38% кучи не используется. 8772K будет размером используемой памяти в куче, а размер 14087K будет размером с кучей.
  • Я не знаю, извините.

Обратите внимание, что вся эта информация основана на сообщении от Robert по знакомому вопросу, размещенному здесь в stackoverflow. Все кредитные (до тех пор, пока это правильно) идет к Роберту.