Я только что посмотрел на управление "памятью для Android" в google io. Слайды доступны здесь http://dubroy.com/memory_management_for_android_apps.pdf. Пример утечки памяти находится на слайде 36.
Я не понимаю, почему это вызывает утечку после изменения ориентации. Я понимаю, что утечка является внутренним классом и имеет ссылку на внешний класс. Кроме того, я понимаю, что статическая переменная "утечка" ссылается на объект "Leaky"... на всю деятельность. Я считаю это особенным из-за статического ключевого слова. Статические переменные имеют определенную память и, вероятно, не являются gc'ed (по крайней мере, пока приложение работает)?!?
Хорошо, что происходит при изменении ориентации? Создается новый экземпляр активности и вызывается деятельность onCreate
. leak == null
является ложным. Утечка все еще указывает на "старую" активность. Это утечка. Старая деятельность не может быть решена, верно?
Почему использование памяти увеличивается с каждым изменением ориентации? В моем (неправильном) понимании я бы предположил, что только первое действие не может быть gc'ed. Другие действия, которые создаются из-за изменения ориентации, могут быть записаны, потому что на них не ссылается эта статическая переменная "утечка".
Однако... очевидно. Я совершенно неправ!