WeakHashMap Java и кэширование: Почему это ссылается на ключи, не значения?

На самом деле на 32-разрядных компьютерах слово является 32-разрядным, но тип DWORD является остатком с добрых старых времен 16-разрядных.

, Чтобы облегчить портировать программы на более новую систему, Microsoft решила, что все старые типы не изменят размер.

можно найти официальный список здесь: http://msdn.microsoft.com/en-us/library/aa383751 (По сравнению с 85) .aspx

Все зависимые типы платформы, которые изменились с переходом от 32-разрядного до 64-разрядного конца с _PTR (DWORD_PTR будет 32-разрядным в 32-разрядном Windows и 64-разрядным в 64-разрядном Windows).

63
задан Matthias 26 November 2009 в 10:16
поделиться

2 ответа

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

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

Простой пример (и тот, который я использовал ранее) может быть примерно таким:

WeakHashMap<Thread, SomeMetaData>

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

См. WeakHashMap не в кеше! для получения дополнительной информации.

Для типа кеша, который вам нужен, либо используйте специальную систему кеширования (например, EHCache ), либо посмотрите google-collections ' класс MapMaker ; что-то вроде

new MapMaker().weakValues().makeMap();

сделает то, что вам нужно, или, если вы хотите пофантазировать, вы можете добавить время истечения срока:

new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();
109
ответ дан 24 November 2019 в 16:11
поделиться

Основное использование WeakHashMap - это когда у вас есть сопоставления, которые вы хотите исчезнуть, когда исчезнут их ключи. Кэш - это обратное: у вас есть сопоставления, которые вы хотите исчезнуть, когда исчезнут их значения.

Для кеша вам нужна Map > . SoftReference будет собирать мусор, когда память становится нехваткой. (Сравните это с WeakReference , которая может быть очищена, как только больше не будет жесткой ссылки на ее референт.) Вы хотите, чтобы ваши ссылки были мягкими в кэше (по крайней мере, в том, где key- сопоставления значений не устаревают), поскольку тогда есть вероятность, что ваши значения все еще будут в кеше, если вы поищете их позже. Если бы вместо этого ссылки были слабыми, ваши значения сразу же были бы gc'd, уничтожение цели кэширования.

Для удобства вы можете скрыть значения SoftReference внутри своей реализации Map , чтобы ваш кеш выглядел как < K, V> вместо > . Если вы хотите это сделать, в этом вопросе есть предложения по реализациям, доступным в сети.

Обратите также внимание на то, что при использовании значений SoftReference в Map , вы должны что-то сделать, чтобы вручную удалить пары ключ-значение, у которых были очищены SoftReferences --- иначе ваша карта будет только расти в размере навсегда, и утечка памяти.

вы можете скрыть значения SoftReference внутри своей реализации Map , чтобы ваш кеш имел тип вместо > . Если вы хотите это сделать, в этом вопросе есть предложения по реализациям, доступным в сети.

Обратите также внимание на то, что при использовании значений SoftReference в Map , вы должны что-то сделать, чтобы вручную удалить пары ключ-значение, у которых были очищены SoftReferences --- иначе ваша карта будет только увеличиваться в размере навсегда, и утечка памяти.

вы можете скрыть значения SoftReference внутри своей реализации Map , чтобы ваш кеш имел тип вместо > . Если вы хотите это сделать, в этом вопросе есть предложения по реализациям, доступным в сети.

Обратите также внимание на то, что при использовании значений SoftReference в Map , вы должны что-то сделать, чтобы вручную удалить пары ключ-значение, у которых были очищены SoftReferences --- иначе ваша карта будет только расти в размере навсегда, и утечка памяти.

SoftReference > . Если вы хотите это сделать, в этом вопросе есть предложения по реализациям, доступным в сети.

Обратите также внимание на то, что при использовании значений SoftReference в Map , вы должны что-то сделать, чтобы вручную удалить пары ключ-значение, у которых были очищены SoftReferences --- иначе ваша карта будет только расти в размере навсегда, и утечка памяти.

SoftReference > . Если вы хотите это сделать, в этом вопросе есть предложения по реализациям, доступным в сети.

Обратите также внимание на то, что при использовании значений SoftReference в Map , вы должны что-то сделать, чтобы вручную удалить пары ключ-значение, у которых были очищены SoftReferences --- иначе ваша карта будет только увеличиваться в размере навсегда, и утечка памяти.

35
ответ дан 24 November 2019 в 16:11
поделиться
Другие вопросы по тегам:

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