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

Что такое WeakHashMap и когда следует его использовать? В чем отличия между WeakHashMap и a HashMap?

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

checkout Эффективное Java, издание 2, стр. 26.

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

Ответ 4

От jGuru:

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

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

Ответ 5

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

  • Статья IBM о:

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

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

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

  • Документация по Java о java.lang.ref

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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