Этот вопрос касается памяти в Android.
Мой метод:
У меня есть две активности: A и B. Из A я запускаю B следующим образом:
Intent i = new Intent(A.this, B.class);
startActivity(i);
Нажмите кнопку B в B, я сделаю следующее:
B.this.finish();
- В B я переопределяю метод onDestroy и устанавливаю все ссылки на null.
- Я не выделяю новую память в методе onResume A.
- Я не утечка контекста.
- Я не использую несколько потоков.
- Я не пользуюсь услугами.
- Все переменные в B являются переменными частного класса, и все они имеют значение null в onDestroy of B.
- Кроме того, ImageViews в B имеют свой фоновый набор null в onDestroy of B.
- Я уверен, что B уничтожен.
Результат:
Когда я нахожусь в действии A, куча памяти составляет 7,44 МБ. Затем, когда я начинаю B и заканчиваю на B (и возвращаясь к A), куча увеличивается на 0,16 МБ. Повторяя этот процесс снова, куча увеличивается на 0,08 МБ каждый раз.
- Я не смотрю на ограничение кучи, я смотрю на выделенную кучу.
- Я вызываю System.gc() в конце метода onDestroy для B.
Дополнительная информация:
-Я использовал MAT для анализа распределения памяти и попытался найти эту утечку. Что-то странное, так это то, что у Activity B есть 5 экземпляров. Как это случилось, я повторял процесс startActivity/finish 5 раз. Нижняя запись - это Activity, остальные - слушатели в действии:
И это скриншот дерева доминанта. Я не могу найти ничего необычного или подозрительного.
- Я просматривал оба видео в google IO при использовании памяти (и утечки).
Вопрос:
Возможно ли, что эта 0.08 МБ кучи будет всегда распределяться (и не собираться GC) независимо от того, что я делаю? Если нет, то какая идея может быть причиной этого?
Update:
-
Я попытался запустить активность B, не установив в B вид содержимого. Это означает, что B является полностью пустой деятельностью. В результате память кучи НЕ увеличивалась, когда я повторно запускаю операцию несколько раз. Обратите внимание, однако, что это не решение. Я должен быть в состоянии установить представление содержимого.
-
scorpiodawg: Я попытался запустить свое приложение на эмуляторе, и куча все еще растет. Хорошая попытка, хотя.
-
ntc: я заменил все вхождения "this" на "getApplicationContext()" там, где это было возможно. Я не мог вызвать setContentView (getApplicationContext()); потому что setContentView хочет ссылку на файл макета, а не контекст. Вместо этого я создал пустой файл макета и вызывал setContentView (emptylayout); в методе onDestroy Activity B. Это не помогло.
-
Я попытался удалить весь код, чтобы вызвать только setContentView (mylayout). Проблема сохранилась. Затем я удалил все элементы gui в XML файле макета. Проблема сохранилась. Единственное, что осталось, это просмотр контейнеров, несколько вложенных линейных, относительных и scrolllayouts. Я попытался удалить настройку атрибута "android: scrollbarDefaultDelayBeforeFade" в полосе прокрутки. Результат был большим, утечка памяти исчезла. Затем я вернул весь код, который я ранее удалил, но не установил атрибут "android: scrollbarDefaultDelayBeforeFade", и утечка памяти вернулась. Как это странно?