Проблема с пропущенным слушателем - Lapsed listener problem
В проблема с пропущенным слушателем является общим источником утечки памяти за объектно-ориентированный языки программирования, одни из самых распространенных для собран мусор языков.[1]
Он берет свое начало в образец наблюдателя, где наблюдатели (или слушатели) регистрируются у субъекта (или издателя) для получения событий. В базовой реализации это требует как явной регистрации, так и явной отмены регистрации, как в шаблон утилизации, потому что субъект имеет сильные отсылки к наблюдателям, поддерживая их жизнь. Утечка происходит, когда наблюдатель не может отписаться от субъекта, когда ему больше не нужно слушать. Следовательно, субъект по-прежнему хранит ссылку на наблюдателя, которая предотвращает сборку мусора, включая все другие объекты, на которые он ссылается, пока субъект жив, что может быть до конца приложения.
Это вызывает не только утечку памяти, но и снижение производительности из-за того, что «незаинтересованный» наблюдатель принимает нежелательные события и реагирует на них. Этого можно избежать, если субъект держит слабые ссылки для наблюдателей, что позволяет им собирать мусор в обычном режиме без необходимости отмены регистрации.
Рекомендации
- ^ Бродяги памяти в Java, Итан Генри и Эд Ликлама