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

Android-сборщик мусора Освобожденная память

Я работаю над приложением, которое обрабатывает множество ассигнований (порядка 4 миллионов удваивается и миллион классов). Я просматривал журналы сборщиков мусора, и я вижу, что разное количество памяти освобождается на разных устройствах.

Например, у меня есть Moto X (2014), который заканчивается освобождением чуть более 312 МБ. У меня также есть Droid Bionic, который запускает тот же код с теми же данными, что в среднем составляет 616 МБ. Оба устройства имеют размер кучи около 50 МБ.

Почему так много памяти освобождается GC на Bionic, чем Moto X? Они должны генерировать столько же мусора каждый. Что происходит за кулисами в сборщике мусора? Moto X находится на Android 5.1, а Bionic - на 4.1.2.

Изменить: у меня есть четыре устройства, которые освобождают около 300 МБ ОЗУ: Moto X (2014), Nexus 7 2013, Nexus 7 2012 и Razr i. Все четыре из них используют АРТ. Bionic работает во время работы Dalvik. Это почему меньше освобождает? Я заметил, что GC_FOR_ALLOC не происходит в АРТ, но все время звонит в Далвик.

4b9b3361

Ответ 1

Цитата из this post:

Затем команда ART работала над оптимизацией сборщика мусора (GC). Вместо двух пауз, составляющих около 10 мс для каждого ГК в Дальвике, вы увидите только один, обычно менее 2 мс. Они также распараллеливаются порции GC и оптимизированные стратегии сбора осознавая состояния устройства. Например, полный GC будет работать только тогда, когда телефон заблокирован, а реакция взаимодействия с пользователем больше не важный. Это огромное улучшение для приложений, чувствительных к сброшенных кадров.

Что автор говорит здесь, так это то, что устройства с питанием от АРТ будут намного эффективнее в контексте GC - как в отношении времени "GC" отходов, так и объема памяти, освобожденного во время выполнения.

Дополнительный вклад в использование нижней памяти можно отнести к этому (это всего лишь предположение):

Пожалуй, самое важное улучшение, теперь ART компилирует ваши приложение на собственный машинный код при установке на пользовательское устройство. Известный как компиляция с опережением времени, вы можете ожидать увидеть большие производительности, поскольку компиляторы настроены для конкретных архитектуры (такие как ARM, x86 или MIPS). Это устраняет необходимость для компиляции "точно вовремя" при каждом запуске приложения. таким образом ваше приложение займет немного больше времени, но будет загружено быстрее при запуске, так как многие задачи, выполняемые во время выполнения на Dalvik VM, такие как проверка класса и метода, уже имели место.

Так как ART компилирует ваше приложение раньше времени, время компиляции может быть расширено, что позволяет компилятору лучше оптимизировать ваш код.