Понимание сообщений Android GC

У меня есть следующее сообщение в моем catlog,

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms

Я пытаюсь понять последнее значение. Я проверил другой вопрос, связанный с GC на сайте, у них либо две паузы, связанные с параллельным GC, либо одна общая пауза для неконкурентного GC. Почему у меня два? Мое приложение приостановилось на 5 + 9 мс или 378 мс? Что такое сумма?

Ответы

Ответ 1

У вас нет окончательного ответа, но из того, что я получаю, GC_CONCURRENT - сборка мусора, которая работает в отдельном потоке. Это означает, что, хотя для запуска может потребоваться в общей сложности X ms (378 в вашем случае), ваш текущий поток работает не будет так долго. Он будет только немного заблокирован в начале и в конце параллельного процесса сбора мусора (5 + 9 = 14 мс в вашем примере)

Этот тип сборки мусора автоматически запускается JVM, когда он решает это хорошо провести время (обычно, когда куча стала опасно высокой). Другие типы GC, такие как GC_EXPLICIT (если я не ошибаюсь в имени) запускаются, когда вы делаете

System.gc();

в вашем коде. Для этого типа сбора мусора он будет сообщать только один раз (например, Y ms), и в этом случае ваш поток будет фактически заблокирован на этот промежуток времени до завершения этого типа процесса GC.

Ответ 2

GC_CONCURRENT: запускается, когда куча растет. Таким образом, он может восстановить память во времени, поэтому куча не нуждается в увеличении

GC_CONCURRENT освобожден 456K

Эта часть рассказывает вам, сколько памяти было освобождено с помощью этой развертки GC

GC_CONCURRENT свободен 456K, 19% бесплатно 2753K/3360K

В этой части указано, сколько% кучи является бесплатным, размер живых объектов и общий размер кучи. Таким образом, в приведенном выше примере 19% свободных, есть 2753Kmemory в использовании и общий размер кучи 3360K.

Последняя часть журнала сообщает вам, сколько времени прошло GC. в коллекции GC_CONCURRENT вы увидите 2 раза. один в начале коллекции и один в конце.

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

Источник:

https://sites.google.com/site/pyximanew/blog/androidunderstandingddmslogcatmemoryoutputmessages

Другое место, где вещи четко объясняются...

http://www.youtube.com/watch?v=_CruQY55HOk

Ответ 3

От взгляда на какие-то систры, которые я воспринимал, кажется, что сумма (378 мс) не отражает, как долго GC фактически приостановила ваше приложение. Он отражает, сколько времени занимает сбор мусора. Временное время - это то, на что вы должны обратить внимание.

Ответ 4

Взгляните на этот question, он объясняет сообщения об уборка мусора и т.д.
Если вам нужна дополнительная информация, посмотрите видео из Google об управлении памятью

Ответ 5

http://www.youtube.com/watch?v=_CruQY55HOk.

Смотреть видео около 17 минут. Парень подробно объясняет сообщение logcat.

GC_CONCURRENT freed 456K, 19% free 2753K/3360K, paused 5ms+9ms, total 378ms
GC_CONCURRENT : Jumps in because Heap is growing
19% free 2753K/3360K After this collection 19% of memory is free. Check the heap usage.paused 5ms+9ms Time taken to collect garbage. Total pause time is 378ms.