Помогите Диме помочь помогать помочь помогать

Прицел тепловизор

19.07.2016


Как отмечалось выше, большинство утечек памяти в потоках связано с объектами, остающимися в памяти дольше, чем необходимо. Потоки и обработчики могут непреднамеренно сохранять объекты достижимыми из корня сборки мусора даже после выхода их из употребления. Далее мы посмотрим, как избежать утечек памяти или хотя бы уменьшить их негативное воздействие.


Реализация Thread, Runnable и Handler в форме статических внутренних классов, обнуление явных сильных ссылок и/или использование слабых ссылок всего лишь смягчают отрицательное воздействие утечек памяти, но не устраняют их полностью. В выполняющемся потоке могут оставаться ссылки, препятствующие сборке мусора. Чтобы поток не задерживал удаления объектов из памяти, следует завершить его сразу после выполнения всей требуемой работы. Собрались на охоту? Стоит купить прицел тепловизор.


На рис. 6.7 демонстрируется, как несовпадение жизненных циклов компонентов, объектов и потоков может задерживать объекты в памяти дольше, чем это действительно необходимо. Обычно причиной слишком долгого существования объекта является изменение конфигурации компонента, когда старый объект продолжает оставаться в памяти, пока выполняется создавший его поток. Если переключить поток со старого на новый объект Activity и удалить ссылку на поток из старого объекта Activity, сборщик мусора сможет удалить старый объект. Порядок переключения зависит от механизмов управления потоками, доступных на конкретной платформе (в данном случае на платформе Android), и каждый из этих механизмов будет рассматриваться в отдельности в соответствующих главах части II.


Сообщение, переданное в поток, может оставаться в очереди сообщений, если оно отправлено с заданным временем задержки выполнения или не завершилась обработка сообщений с более ранними метками времени. Если ожидание сообщения затянулось настолько, что оно стало ненужным, его следует удалить из очереди, чтобы можно было освободить память, занимаемую объектами, на которые ссылается данное сообщение.