2016-10-28 10 views
1

Мне кажется, что иногда АРТ будет локальными переменными GC при выходе из своих областей, но иногда это не произойдет. Мне также кажется, что это всегда будет иметь место для Дальвика.Почему Android ART иногда не будет использовать локальные переменные GC при выходе из их областей?

Я использовал монитор памяти Android Studio для запуска следующих тестовых примеров. Они все о методе testMemoryUsage добавлен в OnCreate:

@Override 
protected final void onCreate(final Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    testMemoryUsage(); // For testing only 
    setupActivity(); // Added to setup the activity to be ready to run 
} 

Test Case 1 (контроль)

testMemoryUsage это просто пустой метод:

// For testing only 
private void testMemoryUsage() { 
} 

Test Case 2 (Не конечная локальная переменная)

testMemoryUsage просто создает нечетное л локальных переменных uniqueStrings:

// For testing only 
private void testMemoryUsage() { 
    List<String> uniqueStrings = new Vector<>(); 
    for (Integer index = 0; index < 1000000; index++) { 
     uniqueStrings.add(index.toString()); 
    } 
} 

Тестирование потока

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

Тестирование Устройства

GT-N7000 (Android версия 4.1.2) - Dalvik

LG-D802 (Android версия 4.4.2) - Dalvik

LG-H860 (Android версия 6.0.1) - АРТ

Nexus 5X (Android версии 7.0) - АРТ

с помощью устройства 2, каждый из которых диффере t Android, с Dalvik и двумя устройствами, каждая с другой версией Android, с ART, эта настройка должна устранить переменные из-за устройств и версий Android, а не Dalvik и ART.

Монитор памяти Результаты

Memory Monitor Result 1(LG-H860 in Test Case 1)

Nexus 5X (АРТ) показывает по существу, аналогичные результаты мониторинга памяти, как это тест случай-контроль. Однако GT-N7000 (Dalvik) и LG-D802 (Dalvik) показывают почти плоские результаты.

Memory Monitor Result 2(LG-H860 in Test Case 2)

Nexus 5X (АРТ) показывает по существу, аналогичные результаты мониторинга памяти. Тем не менее, как GT-N7000 (Dalvik), так и LG-D802 (Dalvik) показывают похожие на пилообразную форму результаты с отбрасыванием края при завершении добавления всех этих 1000000 уникальных строк, что означает, что Dalvik всегда немедленно получает локальную переменную uniqueStrings после выхода из нее scope testMemoryUsage.

В случае с АРТ, иногда GC имеет локальную переменную uniqueStrings, оставляя свой объем testMemoryUsage для запуска 1-го и 2-го приложений, но иногда это не так. Кроме того, иногда такой GC происходит для последующего закрытия и повторного открытия, но иногда это происходит.

Я тестировал эти тесты почти по 10 раз на LG-H860 (ART) и Nexus 5X (ART), а результаты мониторинга памяти довольно противоречивы (вышеупомянутые «иногда») даже для того же теста на одно и то же тестовое устройство, за исключением 1 балла. Либо GC сразу будет иметь место при вышеупомянутых таймингах, либо это произойдет неважно, сколько времени я жду, хотя это может произойти, если я сделаю что-то еще внутри приложения. Однако результаты мониторинга памяти для GT-N7000 (Dalvik) и LG-D802 (Dalvik) очень последовательны.

Я пытался искать в интернете для ответов, но я не смог найти что-нибудь, несмотря на часы усилий, поэтому я решил спросить здесь:

искусство действительно является источником всех этих проблем, или я совершил некоторые ужасные ошибки?

ответ

1

Алгоритм GC ART отличается от алгоритма GC Dalvik. Dalvik будет запущен, как только приложение выйдет, и много раз, даже когда приложение будет работать, вызвав паузы в пользовательском интерфейсе из-за заблокированных операций. По истечении срока действия Dalvik совершенен, он запускается, как только приложение выходит из системы, и выполняет параллельную развертку GC, чтобы очистить память.

План по умолчанию ART - это план CMS (параллельный разметка), который использует в основном липкую CMS и частичную CMS. Sticky CMS - это не движущийся коллективный сборщик мусора ART. Он сканирует только часть кучи, которая была изменена с момента последнего GC и может вернуть только объекты, выделенные с момента последнего GC. В дополнение к плану CMS, ART выполняет сжатие кучи, когда приложение изменяет состояние процесса на незаметное состояние процесса (например, фоновое или кэшированное). Таким образом, вы видите, что поведение GC в искусстве идеально подходит, и он ждет своего следующего цикла развертки GC, чтобы очистить память. Это помогает двумя способами:

  1. Не существует асинхронных GC-разверток. Таким образом, количество СГ-разверток уменьшается по сравнению с Дальвиком.
  2. В вашем случае, так как приложение немедленно перезагружается, память повторно используется соответствующим образом.

Таким образом, АРТ не является источником всех этих проблем, но именно так оно будет вести себя по своему дизайну.

Вы получите более подробную информацию here

+0

Я читал эту статью, прежде чем спрашивать, но ваш ответ поможет мне сделать больше смысл. Благодарю. – DoubleX