Этот вопрос касается памяти в Android.
Мой метод:
У меня есть два актива, A и B. Из A я запускаю B следующим образом:
Intent i = new Intent(A.this, B.class);
startActivity(i);
По нажатию кнопки в B, я делаю это:
B.this.finish();
- В B я переопределяю метод onDestroy и устанавливаю все ссылки на null.
- Я не выделяю новую память в методе onResume для A.
- Я не пропускаю контекст.
- Я не использую несколько потоков.
- Я не пользуюсь услугами.
- Все переменные в B являются переменными частного класса, и все они имеют значение null в onDestroy объекта B.
- Кроме того, для ImageViews в B задан нулевой фон в onDestroy из B.
- Я уверен, что Б. будет уничтожен.
Результат:
Когда я в Деятельности A, объем кучи составляет 7,44 МБ. Затем, когда я запускаю B и вызываю финиш на B (и, следовательно, возвращаюсь к A), куча увеличивается на 0,16 МБ. Повторяя этот процесс снова, куча увеличивается на 0,08 МБ каждый раз.
- Я не смотрю на предел кучи, я смотрю на выделенную кучу.
- Я вызываю System.gc () в конце метода onDestroy для B.
Дополнительная информация:
-Я использовал MAT для анализа распределения памяти и пытался найти эту утечку. Что-то странное в том, что у Деятельности B, кажется, есть 5 экземпляров Как это случилось, я повторял процесс startActivity / finish 5 раз. Нижняя запись - это активность, остальные слушатели в активности:
![enter image description here](https://i.stack.imgur.com/rQVzF.png)
А это скриншот дерева доминирования. Я не могу найти ничего необычного или подозрительного.
![Dominator Tree](https://i.stack.imgur.com/27eCf.png)
-Я смотрел оба видео Google IO об использовании памяти (и утечки).
Вопрос:
Возможно ли, что эти 0,08 МБ кучи будут всегда выделяться (и не собираться GC) независимо от того, что я делаю? Если нет, есть идеи о том, что может быть причиной этого?
Обновление:
Я попытался запустить действие B, не устанавливая представление содержимого в B. Это означает, что B - совершенно пустое действие. В результате кучная память НЕ увеличилась, когда я перезапускаю действие несколько раз. Обратите внимание, однако, что это не решение. Я должен иметь возможность настроить представление содержимого.
scorpiodawg: я попытался запустить свое приложение на эмуляторе, и куча все еще растет. Хорошая попытка, хотя.
ntc: я изменил все вхождения «this» на «getApplicationContext ()», где это было возможно. Я не мог вызвать setContentView (getApplicationContext ()); потому что setContentView хочет ссылку на файл макета, а не контекст. Вместо этого я создал пустой файл макета и вызвал setContentView (emptylayout); в методе onDestroy действия B. Это не помогло.
Я попытался удалить весь код, чтобы вызывался только setContentView (mylayout). Проблема сохраняется. Затем я удалил все элементы графического интерфейса в XML-файле макета. Проблема сохраняется. Единственной вещью, которая осталась, были представления контейнера, пара вложенных линейных, относительных и scrolllayouts. Я попытался удалить настройку атрибута «android: scrollbarDefaultDelayBeforeFade» на полосе прокрутки. Результат был великолепен, утечка памяти исчезла. Затем я вернул обратно весь код, который ранее удалил, но не установил атрибут «android: scrollbarDefaultDelayBeforeFade», и утечка памяти вернулась. Насколько это странно?