Существует ли практическое применение для слабых ссылок?

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Каковы реалистичные ситуации, когда люди используют слабые ссылки?

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Я использую его как правило для кеша определенного типа. Недавно доступные элементы доступны сразу, а в случае промаха в кеше вы перезагружаете элемент (DB, FS, что угодно).

Ответ 9

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