Когда Вы использовали бы WeakHashMap или WeakReference?

161
задан David Newcomb 7 October 2016 в 17:08
поделиться

9 ответов

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

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

Слабые ссылки Понимания , Ethan Nicholas

96
ответ дан Jacob Krall 23 November 2019 в 21:27
поделиться

Одно различие, чтобы быть ясным на является различием между WeakReference и SoftReference.

В основном WeakReference будет GCD JVM нетерпеливо, как только ссылочный объект не имеет никакого твердый ссылки на него. SoftReference объект d, с другой стороны, будет иметь тенденцию быть оставленным о сборщиком "мусора", пока это действительно не должно будет исправлять память.

кэш А, где значения считаются внутренние WeakReference с, был бы довольно бесполезен (в WeakHashMap, это - ключи, на которые слабо ссылаются). SoftReferences полезны для переноса значений, когда Вы хотите реализовать кэш, который может вырасти и уменьшиться с доступной памятью

54
ответ дан Basil Bourque 23 November 2019 в 21:27
поделиться

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

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

я должен был сделать это для добавления некоторых данных к java.awt.Component для обхождения изменения в JRE между 1.4.2 и 1.5, я, возможно, зафиксировал его путем разделения на подклассы каждого компонента, я был заинтересован интервал (JButton, JFrame, JPanel....), но это было намного легче с намного меньшим количеством кода.

30
ответ дан Lii 23 November 2019 в 21:27
поделиться

Это сообщение в блоге демонстрирует использование обоих классов: Java: синхронизация на идентификаторе . Использование проходит примерно так:

private static IdMutexProvider MUTEX_PROVIDER = new IdMutexProvider();

public void performTask(String resourceId) {
    IdMutexProvider.Mutex mutext = MUTEX_PROVIDER.getMutex(resourceId);
    synchronized (mutext) {
        // look up the resource and do something with it
    }
}

IdMutextProvider обеспечивает основанные на идентификаторе объекты синхронизироваться на. Требования:

  • должен возвратиться, ссылка на тот же объект для параллельного использования эквивалентных идентификаторов
  • должна возвратить различный объект для различных идентификаторов
  • никакой механизм выпуска (объекты не возвращаются поставщику)
  • , не должен протекать (неиспользуемые объекты имеют право на сборку "мусора")

, Это достигается с помощью карты внутренней памяти типа:

WeakHashMap<Mutex, WeakReference<Mutex>>

объект является и ключом и значением. Когда ничто внешнее к карте не имеет твердую ссылку на объект, это может быть собрано "мусор". Значения в карте снабжены твердыми ссылками, таким образом, значение должно быть обернуто в WeakReference для предотвращения утечки памяти. На этот последний вопрос отвечают в javadoc.

4
ответ дан McDowell 23 November 2019 в 21:27
поделиться

Если Вы, например, хотите отслеживать все объекты, созданные из определенного класса. Чтобы все еще позволить этим объектам быть собранными "мусор", Вы сохраняете список/карту слабых ссылок на объекты вместо самих объектов.

Теперь, если бы кто-то мог бы объяснить фантомные ссылки на меня, я был бы счастлив...

3
ответ дан JesperE 23 November 2019 в 21:27
поделиться

Как указано выше, слабая ссылка сохранены столько, сколько сильная ссылка существует.

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

При игре со слушателями, как описано выше мы быстро поняли, что объекты "сразу" собраны с точки зрения пользователя.

3
ответ дан Pacerier 23 November 2019 в 21:27
поделиться

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

2
ответ дан 23 November 2019 в 21:27
поделиться

Я сделал поиск кода Google "нового WeakHashMap ()".

я получил набор соответствий из проекта пути к классу GNU и

  1. Apache xbean Проект: проект WeakHashMapEditor.java
  2. Apache Lucene: CachingWrapperFilter.java
1
ответ дан David Newcomb 23 November 2019 в 21:27
поделиться

можно использовать weakhashmap для реализации кэширования без ресурсов для расширяемого создания объекта.

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

-1
ответ дан Andreas Petersson 23 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

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