Пример утечки памяти Android из Google I / O - PullRequest
11 голосов
/ 02 октября 2011

Я только что посмотрел видео Google io "Управление памятью для Android". Слайды доступны здесь http://dubroy.com/memory_management_for_android_apps.pdf. Пример утечки памяти приведен на слайде 36.

Я не понимаю, почему это вызывает утечку после изменения ориентации. Я понимаю, что утечка является внутренним классом и имеет ссылку на внешний класс. Кроме того, я понимаю, что статическая переменная «утечка» ссылается на объект «утечка» .. это вся деятельность. Я думаю, что это особенное из-за статического ключевого слова. Статические переменные имеют определенную память и, вероятно, не gc'ed (по крайней мере, пока приложение работает)?!?

Ну, что происходит при смене ориентации? Создается новый экземпляр действия и вызывается действие onCreate. leak == null ложно. Утечка еще указывает на «старую» активность. Это утечка. Старая активность не может быть получена, верно?

Почему использование памяти увеличивается с каждым изменением ориентации? В моем (неправильном) понимании я бы предположил, что только первое действие не может быть получено. Другие активности, созданные из-за изменения ориентации, могут быть скопированы, потому что на них не ссылается эта статическая переменная «утечка».

Однако ... очевидно ... Я совершенно не прав!

Ответы [ 2 ]

2 голосов
/ 03 октября 2011

Классическое объяснение изменения ориентации Утечка памяти в контексте из Google blog . Я думаю, что вы прошли большую часть пути, отметив статическую ссылку внутреннего на внешний класс.

1 голос
/ 10 февраля 2015

Вы не понимаете, потому что вы сделали критическую ошибку. течь == ноль верно во вновь созданном действии. утечка по-прежнему не указывает на «старую» активность.

Почему? Я думал, что утечка была статичной, спросите вы. Что ж. , .

Итак, в первый раз действие создается, утечка равна нулю, затем onCreate () и утечка теперь ссылается на объект Leaky. Если я создам больше экземпляров этого действия, их утечки не будут равны нулю и будут ссылаться на тот же объект.

Но что происходит, когда вы переворачиваете ориентацию, так это то, что действие разрушается. Таким образом, не существует экземпляра объекта деятельности. Затем Android создает новое действие, в котором утечка равна нулю (поскольку в отношении Android другого экземпляра действия не существует).

Однако для сборщика мусора кто-то имеет ссылку на уничтоженную активность, а именно на ее внутренний класс Leaky. Так что это не освободит эту память. Следовательно, продолжая менять ориентацию, вы продолжаете пропускать воспоминания о деятельности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...