Понимание сообщений 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.