Внутренние классы
16.07.2016Внутренние классы (inner classes) являются членами внешнего (содержащего их) объекта, который в данном контексте можно классифицировать как внешний класс (outer class), и имеют доступ ко всем другим членам этого внешнего класса. Как следствие внутренний класс в неявной форме содержит ссылку на внешний класс. Из этого следует, что потоки, определяемые как внутренние классы, ссылаются на свой внешний класс, который никогда не будет помечен для сборки мусора, пока выполняется данный поток. В следующем примере все объекты в классе Outer непременно должны оставаться в памяти вместе с объектами из класса SampleThread всё время, пока выполняется этот поток.
Однако в большинстве случаев программисту требуется отделить среду выполнения (Thread) от задачи (Runnable). Если новый объект Runnable создается как внутренний класс, он будет хранить ссылку на свой внешний класс в течение всего времени выполнения, даже если был инициализирован статическим внутренним классом. Необходимо организовать фотоссессию? Закажите мобильные стенды "пресс-волл". Они отлично справяться с задачей.
Самой главной причиной утечек памяти в ОС Android является рассогласование жизненных циклов (lifecycle mismatch) между компонентами, объектами и потоками. Объекты размещаются в общей памяти (куче), могут быть доступны для сборки мусора и сохраняться в памяти, пока существуют ссылки на них из потоков. Однако в ОС Android приложение должно поддерживать не только жизненный цикл объектов, но также управлять своими компонентами. Все компоненты - Activity, Service, BroadcastReceiver, ContentProvider - имеют собственные жизненные циклы, которые далеко не всегда соответствуют жизненным циклам объектов.
Утечка памяти в объектах Activity - самый опасный и, вероятно, наиболее часто встречающийся случай из всех вариантов утечек в компонентах. Например, объект Activity может иметь ссылку на иерархию представлений (view), содержащих огромное количество фрагментов памяти, выделенных из кучи. На рис. 6.6 показано сравнение жизненных циклов компонента и объектов Activity.