Избегать утечек памяти в обратных вызовах? [Дубликат]

  

Возможный дубликат:
Как избежать утечек памяти при обратном вызове?

Эффективная Java говорит:

  

Третий распространенный источник утечек памяти - слушатели и другие   Обратные вызовы. Если вы реализуете API, где клиенты регистрируют обратные вызовы   но не отменяйте регистрацию явно, они будут накапливаться, если вы не   принять меры Лучший способ гарантировать, что обратные вызовы являются мусором   Собранный оперативно хранить только слабые ссылки на них, для   Например, сохраняя их только в качестве ключей в WeakHashMap.

Я не могу этого понять. может кто-нибудь объяснить это?

7 голосов | спросил Rishi 12 MonEurope/Moscow2011-12-12T17:48:24+04:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2011 17:48:24 +0400 2011, 17:48:24

3 ответа


0

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

Проблема с этим подходом заключается в том, что у вас не может быть прослушивателя, на который есть ссылки только в коллекции, поскольку он исчезнет случайным образом (на следующем GC)

Я склонен использовать слушателей, на которые нет ссылок нигде, и стараюсь обеспечить правильное удаление неиспользуемых слушателей.

ответил Peter Lawrey 12 MonEurope/Moscow2011-12-12T17:54:23+04:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2011 17:54:23 +0400 2011, 17:54:23
0

Наличие слабой ссылки на объект не предотвращает его сборку мусора - если нет более сильных ссылок на объект, в конечном итоге это будет сборщик мусора и вы больше не сможете получить к нему доступ через код > ---- +: = 0 =: + ---- вы сохранили. Google WeakReference для получения дополнительной информации.

ответил OpenSauce 12 MonEurope/Moscow2011-12-12T17:53:26+04:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2011 17:53:26 +0400 2011, 17:53:26
0

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

ответил belgther 12 MonEurope/Moscow2011-12-12T17:53:46+04:00Europe/Moscow12bEurope/MoscowMon, 12 Dec 2011 17:53:46 +0400 2011, 17:53:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132