Есть ли практическое применение слабым ссылкам?

Возможный дубликат:
Слабые ссылки - насколько они полезны?

Поскольку сборщик мусора может требовать слабые ссылки в любое время, есть ли практическая причина для их использования?

9 ответов

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

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

BTW Soft References похожи на Слабые ссылки, но они не всегда будут очищены сразу. GC всегда отбрасывает слабые ссылки, когда может, и сохраняет мягкие ссылки, когда может.

Существует еще одна разновидность ссылок, называемая фантомной ссылкой. Это используется в процессе очистки GC и относится к объекту, который недоступен "нормальному" коду, потому что он находится в процессе очистки.

Поскольку сборщик мусора может требовать слабой ссылки в любое время, есть ли практическая причина использовать его?

Конечно, есть практические причины для его использования. Было бы ужасно странно, если бы разработчики фреймворков потратили огромные средства на создание слабой системы отсчета, которая была бы непрактичной, не так ли?

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

В каких реальных ситуациях люди используют слабые ссылки?

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

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

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

Если WeakReference является единственной ссылкой на объект, и вы хотите, чтобы объект зависал вокруг, вы, вероятно, должны использовать SoftReference.

WeakReferences лучше всего использовать в тех случаях, когда будут другие ссылки на объект, но вы не можете (или не хотите) определять, когда эти другие ссылки больше не используются. Затем другая ссылка предотвратит сборку мусора для объекта, а WeakReference будет просто еще одним способом добраться до того же объекта.

Два распространенных варианта использования:

  1. Для хранения дополнительной (часто дорогостоящей, но воспроизводимой) информации о конкретных объектах, которые вы не можете изменить напрямую, и жизненный цикл которых вы не можете контролировать. WeakHashMap - это идеальный способ хранения этих ссылок: ключ в WeakHashMap хранится слабо, поэтому, когда ключ собирается мусором, его значение также можно удалить с карты и, следовательно, собрать мусором.
  2. Для реализации какой-либо системы событий или уведомлений, где "слушатели" регистрируются с помощью своего рода координатора, чтобы они могли быть проинформированы, когда что-то происходит, - но вы не хотите, чтобы эти слушатели не собирали мусор, когда они приходят в конец их жизни. WeakReference будет указывать на объект, пока он еще жив, но будет указывать на "ноль" после того, как исходный объект будет собран мусором.

Мы используем его по этой причине - в нашем примере у нас есть множество слушателей, которые должны зарегистрироваться в службе. Служба хранит слабые ссылки на слушателей, в то время как экземпляры классов сохраняют сильные ссылки. Если классы в любое время получают GC, слабая ссылка - это все, что остается от слушателей, которые затем также будут GC. Это значительно облегчает отслеживание промежуточных классов.

Чаще всего слабые ссылки используются для значений в "справочных" Картах.

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

Тот факт, что сама карта имеет (единственную) ссылку на объект, не мешает его сборке мусора, поскольку ссылка является слабой ссылкой

Чтобы предотвратить утечки памяти, см. Эту статью для деталей.

Слабая ссылка - это ссылка, которая не защищает референтный объект от сбора сборщиком мусора.

  • Объект, на который ссылаются только слабые ссылки, считается недостижимым (или "слабо достижимым") и может быть собран в любое время.
  • Слабые ссылки используются, чтобы избежать сохранения памяти, на которую ссылаются ненужные объекты. Некоторые языки сборки мусора поддерживают или поддерживают различные уровни слабых ссылок, такие как Java, C#, Python, Perl или Lisp.
  • Сборка мусора используется для уменьшения вероятности утечек памяти и повреждения данных. Существует два основных типа сборки мусора: трассировка и подсчет ссылок. Схемы подсчета ссылок записывают количество ссылок на данный объект и собирают объект, когда счетчик ссылок становится равным нулю. Подсчет ссылок не может собирать циклические (или циклические) ссылки, поскольку за один раз может быть собран только один объект. Таким образом, группы взаимно ссылающихся объектов, на которые не ссылаются непосредственно другие объекты и которые недоступны, могут стать постоянными резидентами; если приложение постоянно генерирует такие недоступные группы недоступных объектов, это приведет к утечке памяти. Слабые ссылки могут быть использованы для решения проблемы циклических ссылок, если избежать циклов ссылок, используя слабые ссылки для некоторых ссылок в группе.
  • Слабые ссылки также используются, чтобы минимизировать количество ненужных объектов в памяти, позволяя программе указывать, какие объекты не являются критическими, путем их слабой ссылки.

Я использую это вообще для некоторого типа кэша. Недавно открытые элементы доступны сразу, и в случае пропуска кэша вы перезагружаете элемент (БД, ФС и т. Д.).

Я использую WeakSet кодировать ссылки в графе. Если узел удален, ссылки автоматически исчезают.

Другие вопросы по тегам