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

В каких условиях АРТ сокращает кучу?

Одна из рекламируемых функций ART runtime в Android 5.0+ - это сжатие кучи, чтобы уменьшить фрагментацию кучи. Фрагментированная куча может получить OutOfMemoryErrors намного проще, так как может быть не один непрерывный свободный блок памяти, достаточно большой для ваших потребностей, даже если куча в целом имеет достаточно свободного места.

Я понимаю, что это происходит, когда приложение перемещается на задний план, на основе презентаций конференции Google и тому подобного. Однако единственное утверждение, которое я могу найти на нем в в документации, говорит:

Однородное уплотнение пространства - это свободное пространство для свободного пространства в свободном списке, которое обычно происходит, когда приложение перемещается в состояние незаметного процесса паузы. Основными причинами этого являются сокращение использования ОЗУ и дефрагментация кучи.

Непонятно, что означает "пауза незаметного состояния процесса", технически.

Предположим, что на данный момент приложение не имеет каких-либо операций переднего плана. Есть ли что-нибудь, что мог сделать разработчик, что может помешать сжатию кучи для этого процесса приложения? Например, имеет ли компрессия кучи блока переднего плана?

4b9b3361

Ответ 1

Поместите кусочки головоломки вместе.

Из того, что я могу определить, ART сократит все, что приостановлено на 2-3 секунды, и приостановлено, это означает, что в настоящее время он не работает в фоновом режиме, поэтому действия, но не запущенные службы. Он также будет компактным "на лету" или одновременно, когда приложение находится на переднем плане.

В настоящее время событие, которое вызывает уплотнение кучи, это изменения состояния процесса ActivityManager. Когда приложение переходит на задний план, оно уведомляет ART о том, что состояние процесса больше не "заметное". Это позволяет АРТ делать то, что вызывает длительные паузы в приложении, такие как уплотнение и дефляция монитора.

Чет Хассе утверждает:

Сбор мусора
ART принесла улучшенную динамику сбора мусора. Во-первых, ART - это движущийся коллекционер; он способен сжимать кучу, когда длительная пауза в приложении не влияет на работу пользователя (например, когда приложение находится в фоновом режиме и не воспроизводит аудио). Кроме того, существует отдельная куча для больших объектов, таких как растровые изображения, что позволяет быстрее находить память для этих больших объектов, не пробираясь сквозь потенциально фрагментированную обычную кучу. Паузы в АРТ регулярно находятся в области 2-3 мс.

Из того, что я вижу, любая пауза в приложении - это честная игра для GC ART.

Я подозреваю, что приложение должно быть полностью приостановлено из всех служб и т.д. для компакт-диска, поскольку оно перераспределяет адреса памяти кучи, и для этого это не может измениться. Поскольку этот более крупный компакт, который берется во время паузы приложения, а не на лету, является динамической перестановкой кучи. Единственные изменения, которые могут быть сделаны в меньших паузах, - это перенаправить некоторые адреса на процессы, которые больше не используются.

Хотя это обоснованное предположение, а не окончательное, и я постараюсь получить дополнительную информацию.

Исходный код должен иметь ответ. Они используют имена как InJankPerceptibleProcessState() и пытаются пробраться через это, поскольку вы, вероятно, уже имеете себя.

Чтение, будет обновлять ответ, когда/если я нахожу определенный ответ.

Ответ 2

Однородное уплотнение пространства - это свободное пространство для свободного пространства в свободном списке, которое обычно происходит, когда приложение перемещается в состояние незаметного процесса паузы. Основными причинами этого являются уменьшение использования ОЗУ и дефрагментация кучи.

Источник: https://developer.android.com/studio/profile/investigate-ram.html#LogMessages

Ответ 3

Фактически вы можете измерить время простоя приложения. Запустите таймер простоя и остановитесь, если в приложении TextWatcher/OnKeylistner есть какое-либо событие, если приложение находится в фоновом режиме, и ни одно из этих событий не вызвано, полезно собрать GC.

Также это сокращение кучи основано на событиях и приоритетах. Например, если никогда не бывает сценария, когда пользователю нужна память, ОС даже не сделает этого.

Что касается приоритета, то для сбора мусора он ищет фоновые приложения без фоновой службы, затем приложение с фоновым сервисом и, наконец, приложения на переднем плане.