Что такое WeakHashMap и когда его использовать? [дубликат]

этот вопрос уже есть ответ здесь:

что это WeakHashMap и когда его следует использовать? Каковы различия между WeakHashMap и HashMap?

8 ответов


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

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


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

Я бы предложил прочитать "Понимание" Слабых "Ссылок" (Статья в блоге Oracle), о сильные и слабые ссылки в Java. Без понимания разницы сама структура данных имеет мало смысла.


проверка эффективной Java, издание 2, Страница 26.

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


С jGuru:

WeakHashMap-это специальная карта реализация где ключи карты хранятся в java.lang.ref.WeakReference. От хранение ключей в слабой ссылке, пары ключ-значение могут динамически упал с карты, когда единственный ссылка на ключ от слабых ссылка. Это делает WeakHashMap отличная реализация для список слабых ссылок, где записи которые не используются в других местах упал без побочные явления. Также, просто потому, что ключ может быть удален, это не значит, что это будет немедленно упал. Если система имеет достаточно ресурсы, слабая ключевая ссылка, которая не внешне ссылается может остаться вокруг долгое время.

подробнее о ссылки:


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

  • An статья IBM о:

    теория и практика Java: устранение утечек памяти посредством слабых ссылок. Утечки памяти с глобальными картами, выявление утечек памяти, слабые ссылки на спасение, ...

  • A статья в блоге о том, когда использовать WeakHashMap:

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

  • В Java документация о java.ленг.ref


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

поместите туда объект, которого в настоящее время нет используемый. Когда этот объект нужен-достаньте его карты. Большую часть времени большинство из них объекты будут оставаться на карте. Фокус в том, что их не держат напрямую, но через WeakReferences. Так что если он будет очень людно, когда мы бежим из памяти gc будет разрешено собирать их. Поэтому каждый раз, когда вы пытаетесь получить объект из WeakHashMap, вы должны обеспечить его все еще там. В противном случае вам нужно воссоздать его.


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


Weakhashmap позволяет своим записям быть собранным мусором, а не ждать, пока полный hashmap не будет использован. Таким образом, он автоматически удалит отдельные значения, когда его ключ больше не используется.

Он может быть использован для предотвращения утечки памяти, где hashmap никогда не утилизируется, поскольку один или несколько ключей все еще используются, даже если maximum нет, например, пользовательские данные и т. д...