Мне кажется, что иногда АРТ будет локальными переменными 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) очень последовательны.
Я пытался искать в интернете для ответов, но я не смог найти что-нибудь, несмотря на часы усилий, поэтому я решил спросить здесь:
искусство действительно является источником всех этих проблем, или я совершил некоторые ужасные ошибки?
Я читал эту статью, прежде чем спрашивать, но ваш ответ поможет мне сделать больше смысл. Благодарю. – DoubleX