Прошедший слушатель проблема

редактировать

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

Он берет свое начало в шаблоне наблюдателя, где наблюдатели (или слушатели) регистрируются с субъектом (или издатель), чтобы получать события. В базовой реализации это требует как явной регистрации, так и явной отмены регистрации, как в шаблоне удаления , поскольку субъект содержит сильные ссылки на наблюдателей, сохраняя их активность. Утечка происходит, когда наблюдатель не может отписаться от субъекта, когда ему больше не нужно слушать. Следовательно, субъект по-прежнему хранит ссылку на наблюдателя, которая предотвращает сборку мусора, включая все другие объекты, на которые он ссылается, пока субъект жив, что может быть до конца приложения.

Это вызывает не только утечку памяти, но и снижение производительности из-за того, что "незаинтересованный" наблюдатель принимает нежелательные события и реагирует на них. Этого можно избежать, если субъект держит слабые ссылки на наблюдателей, что позволяет им собирать мусор в обычном режиме без необходимости отмены регистрации.

Ссылки

  1. ^Бродяги памяти в Java, Итан Генри и Эд Ликлама
Последняя правка сделана 2021-05-26 13:27:07
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте