2016-09-19 3 views
29

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

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

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

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

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

+6

Просто проверьте, что вы прочитали https://source.android.com/devices/tech/dalvik/gc-debug.html, где говорится о «уплотнении кучи». В настоящее время событие, которое вызывает уплотнение кучи, Изменения состояния процесса ActivityManager. Когда приложение переходит на задний план, оно уведомляет ART о том, что состояние процесса больше не «подхвачено». « –

+0

@MorrisonChang: Нет, я пропустил эту страницу - спасибо! Это помогает, но я не знаю, как интерпретировать «приложение переходит на задний план». Если это буквально ссылается на ['IMPORTANCE_BACKGROUND'] (https://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html#IMPORTANCE_BACKGROUND), то даже наличие запущенной службы может блокировать сжатие кучи. – CommonsWare

+0

похоже, что вы просто хотели быть уверены. возникли ли у вас какие-либо проблемы со службами, связанными с фоновыми заданиями? было бы здорово, если бы вы столкнулись с проблемой, связанной с производительностью. и об услугах они имеют низкий приоритет по сравнению с задачами переднего плана, и они были с тех пор, как с самого начала, как ваш сервис будет убит или заблокирован, когда телефон будет закрыт в памяти. копать глубоко, вы можете прочитать о липких CMS и графе объектов, поможет –

ответ

0

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

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

+4

Вот что у меня в моем вопросе. Вы можете сказать это, прочитав вопрос и взглянув на цитируемый отрывок. – CommonsWare

+2

@ Jamil Hasnine Tamim. Рад за смелый ответ. Дорогой ты даже знаешь, кто CommonsWare ... !! Он легенда ... И если он задает какой-то вопрос (который сам очень редок!), Вы должны думать не дважды, а более 100 раз, прежде чем отвечать! В любом случае, для этой попытки! ... И еще одна вещь: я не тот, кто вас низвонил ... Наверное, вы могли бы подумать, вот почему я упоминаю здесь – Stallion

+0

@CommonsWare sry bro ... Я новичок в стеке, но Я пытаюсь дать некоторую информацию, а не точный ответ! Извиняюсь ... и жду ответа. –

-1

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

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

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

+0

Этот вопрос не имеет ничего общего с временем простоя приложения. Просьба представить любые доказательства того, что уплотнение кучи является «приоритетным». Кроме того, укажите любые доказательства того, что уплотнение кучи выполняется в приложениях переднего плана, поскольку в документации четко указано иное. – CommonsWare

7

Вложение частей головоломки вместе.

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

Currently, the event that triggers heap compaction - это изменения состояния процесса ActivityManager. Когда приложение переходит на задний план, оно уведомляет ART о том, что состояние процесса перестает быть «заметным». Это позволяет ART делать то, что вызывает длительные паузы в приложениях, такие как сжатие и дефляция монитора.

Chet Hasse состояния:

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

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

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

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

source code here should have the answer. Они используют именование, как InJankPerceptibleProcessState(), и пытаются пробраться через это, как вы, вероятно, уже имеете себя.

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

+0

«Я подозреваю, что приложение должно быть полностью приостановлено из всех служб и т. Д. Для компактного устройства». Я надеюсь, что прессование будет заблокировано службами переднего плана, но не регулярными службами без переднего плана. Но это выходит за рамки проблемы. Мы, как разработчики, действительно должны знать, что мы делаем (или не делаем), которые влияют на то, сможет ли АРТ сжать кучу. Если ответ - это то, что вы подозреваете, что с любым уплотнением кучи сервисов, это было бы важно знать. – CommonsWare

+0

@CommonsWare жаль, что это не окончательный ответ, когда вы задаете вопрос, гарантируя, что это нелегкая информация. Я все еще переживаю этот исходный код. Он имеет 4000 линий. Я думал, что отправлю предварительный ответ, если на самом деле я не получу ничего лучше. Я думаю, что кусок кучи с запущенным сервисом может вызвать серьезные сбои. –

+1

О, пожалуйста, не принимайте мои комментарии в качестве жалобы! Я просто разъяснял проблему, вот и все. Большое спасибо за вашу помощь! – CommonsWare

Смежные вопросы