8 ответов:
элементы в слабой хэш-карте могут быть восстановлены сборщиком мусора, если нет других сильных ссылок на ключевой объект, это делает их полезными для хранения кэшей/поиска.
слабые ссылки не ограничиваются этими хэш-таблицами, вы можете использовать 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 с объектом в качестве ключа, и дополнительная информация в качестве значения карты. Тогда, пока вы держите один сильная ссылка на объект, вы сможете проверить карту получить дополнительную информацию. И как только вы отпустите объект, запись в карте будет очищена и память, используемая дополнительной информацией будут освобождены. ...
люди используют его для реализации кэш-памяти'. Если у вас есть некоторые объекты, которые используются часто в вашем приложении, и их строительство дорогое, а там их слишком много, чтобы держать их всех в памяти - - вам использовать WeakHashMap.
поместите туда объект, который в настоящее время не является используемый. Когда этот объект нужен-достаньте его карты. В течение большей части времени большинство из них объекты будут оставаться на карте. Фишка в том, что они не проводятся напрямую, но через WeakReferences. Поэтому, если он действительно "переполнен", когда мы бежим из памяти, gc будет разрешено собирать их. Поэтому каждый раз, когда вы пытаетесь получить объект из WeakHashMap, вы должны обеспечить его все еще там. В противном случае вам нужно воссоздать его.
вы можете использовать WeakHashmap, чтобы уменьшить вероятность утечки памяти в результате кэширования какой-то предмет. WeakHashMap автоматически удаляет записи всякий раз, когда все ссылки на ключ удаляются.
Weakhashmap позволяет своим записям быть собранным мусором, а не ждать, пока полная hashmap не будет использоваться. Таким образом, он автоматически удалит отдельные значения, когда его ключ больше не используется в обычном режиме.
Он может использоваться для предотвращения утечки памяти, где hashmap никогда не исправляется, поскольку один или несколько ключей все еще используются, даже если максимум не используется, например, пользовательские данные и т. д...
Comments