Возможный дубликат:
Слабые ссылки - насколько они полезны?
Так как слабые ссылки могут быть заявлены сборщиком мусора в любой момент, есть ли практическая причина их использования?
Возможный дубликат:
Слабые ссылки - насколько они полезны?
Так как слабые ссылки могут быть заявлены сборщиком мусора в любой момент, есть ли практическая причина их использования?
Если вы хотите сохранить ссылку на что-либо, если оно используется в другом месте, например. прослушиватель, вы можете использовать слабую ссылку.
WeakHashMap может использоваться в качестве короткого кэша ключей для полученных данных. Он также может использоваться для хранения информации об объектах, используемых где-то еще, и вы не знаете, когда эти объекты будут отброшены.
BTW Soft Ссылки похожи на слабые ссылки, но они не всегда будут очищены немедленно. GC всегда будет отбрасывать слабые ссылки, когда это возможно, и сохранять Soft References, когда это возможно.
Существует еще один вид ссылки, называемый ссылкой Phantom. Это используется в процессе очистки GC и относится к объекту, который не доступен для "нормального" кода, потому что он находится в процессе очистки.
Так как слабая ссылка может быть заявлена сборщиком мусора в любое время, есть ли практическая причина использовать ее?
Конечно, есть практические причины для его использования. Было бы странно странно, если бы дизайнеры фреймворков столкнулись с огромными расходами на создание слабой системы отсчета, которая была бы непрактичной, разве вы не думаете?
Я думаю, что вопрос, который вы намеревались спросить, был:
Каковы реалистичные ситуации, когда люди используют слабые ссылки?
Есть много. Общим является достижение цели производительности. При настройке производительности приложения часто требуется компромисс между большим объемом использования памяти и большим использованием времени. Предположим, например, что существует комплексный расчет, который вы должны выполнять много раз, но вычисление является "чистым" - ответ зависит только от аргументов, а не от экзогенного состояния. Вы можете создать кеш - карту от аргументов к результату, но затем она использует память. Вы, возможно, никогда не зададите вопрос снова, и эта память будет потрачена впустую.
Слабые ссылки, возможно, решают эту проблему; кеш может стать довольно большим, и поэтому время сохраняется, если один и тот же вопрос задается много раз. Но если кеш становится достаточно большим, чтобы сборщик мусора должен был освободить место, он может сделать это безопасно.
Недостатком, конечно же, является то, что политика очистки сборщика мусора настраивается для достижения целей всей системы, а не конкретной проблемы с кешем. Если политика GC и требуемая политика кэша достаточно выровнены, то слабые ссылки - это очень прагматическое решение этой проблемы.
Если WeakReference является единственной ссылкой на объект, и вы хотите, чтобы объект зависал, вы, вероятно, должны использовать SoftReference.
WeakReferences лучше всего использовать в тех случаях, когда будут другие ссылки на объект, но вы не можете (или не хотите их обнаруживать), когда эти другие ссылки больше не используются. Затем другая ссылка предотвратит сбор объекта из мусора, а WeakReference будет просто другим способом добраться до одного и того же объекта.
Два распространенных варианта использования:
Мы используем его по этой причине - в нашем примере у нас есть множество слушателей, которые должны зарегистрироваться в службе. Служба сохраняет слабые ссылки на слушателей, в то время как экземплярированные классы сохраняют сильные ссылки. Если классы в любое время получают GC'ed, то слабая ссылка - это все, что осталось от слушателей, которые затем будут GC'ed. Это облегчает отслеживание промежуточных классов.
Наиболее распространенное использование слабых ссылок для значений в "поиске" Карт.
С нормальными (жесткими) ссылками на значения, если значение на карте больше не ссылается на нее в другом месте, вам часто не нужен поиск. При слабой ссылке значения карты, как только нет других ссылок на нее, объект становится кандидатом на сбор мусора
Тот факт, что сама карта имеет (единственную) ссылку на объект, не мешает ей собирать мусор, потому что ссылка является слабой ссылкой
Чтобы предотвратить утечку памяти, см. статью для деталей.
Слабая ссылка - это ссылка, которая не защищает объект-референт от коллекции сборщиком мусора.
Я использую его как правило для кеша определенного типа. Недавно доступные элементы доступны сразу, а в случае промаха в кеше вы перезагружаете элемент (DB, FS, что угодно).
Я использую WeakSet
для кодирования ссылок на графике. Если элемент node удален, ссылки автоматически исчезнут.