Есть ли SoftHashMap в Java?
Я знаю, что в java есть WeakHashMap.util, но поскольку он использует WeakReferences для всего, на что ссылается только эта карта, ссылочные объекты будут потеряны в следующем цикле GC. Поэтому это почти бесполезно, если вы хотите кэшировать случайные данные, которые, скорее всего, будут запрошены снова, не будучи жестко связанными в остальное время. Лучшим решением была бы карта, которая использует SoftReferences вместо этого, но я не нашел ее в пакете Java RT.
6 ответов
Edit (Aug. 2012):
оказывается, что в настоящее время лучшим решением, вероятно, является Guava 13.0 Cache
классы, пояснила о Вики гуавы - это то, что я собираюсь использовать.
Он даже поддерживает построение SoftHashMap
(см. CacheBuilder.newBuilder().softKeys()
), но это, вероятно, не то, что вы хотите, как объясняет эксперт Java Джереми Мэнсон (ниже вы найдете ссылку).
Не так Я знаю (Nov. 2008), но вы вроде находите некоторую реализацию SoftHashMap
в сети.
вот так: SoftHashMap
или этот.
Edit (Nov. 2009)
As Маттиас упоминает в комментариях Google Guava картографа использует SoftReferences:
A
ConcurrentMap
builder, предоставляя любую комбинацию этих функций:
- мягкие или слабые ключи,
- мягкий или слабый ценности,
- срок годности, и
- по требованию вычисление значений.
как говорится в этой теме, другой кандидат JSR166y:
jsr166y.ConcurrentReferenceHashMap
он предоставляет альтернативную параллельную справочную карту реализации Google (которая полагается на фоновый поток для выселения записей)
изменить (Август 2012 года)
реализация Google использует фоновый поток только тогда, когда запрашивается временный срок действия записей. В частности, он просто использует java.util.Timer
, что не так навязчиво, как наличие отдельного фонового потока.
Джереми Мэнсон рекомендует для любого кэша использовать эту функцию, чтобы избежать опасностей SoftReference: http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html
есть еще одна реализация от Apache Commons, а именно org.апаш.палата общин.коллекции.карта.ReferenceMap; он не поддерживает временное удаление, но он поддерживает выбор, следует ли сравнивать ключи по идентичности или по равенству. Более того, эта реализация не является параллельной - ее можно синхронизировать, но она работает менее хорошо при доступе из нескольких потоков.
Я знаком с двумя библиотеками, которые предлагают реализацию SoftHashMap:
Apache Commons: org.апаш.палата общин.коллекции.карта.ReferenceMap
Google Коллекции: com.гуглить.общий.собирать.ReferenceMap
вы рассматривали возможность использования LRUMap вместо мягкого HashMap? Вы получаете больше контроля над тем, что хранятся (или, по крайней мере, сколько).
Если вы хотите реализовать Cache softreferences, это определенно лучшая идея, чем слабые ссылки, но она помещает всю вашу политику удаления кэша в руки сборщика мусора. что, вероятно, не то, чего ты хочешь.
если политика удаления кэша важна, вам нужно будет сделать это самостоятельно, скорее всего, используя регулярные ссылки. Однако вам придется решить, когда, чтобы извлечь и выкинуть. Если ты только хочешь потерять что-то, когда ты ... исчерпание пространства кучи вы можете запросить доступное пространство кучи через:
Runtime.getRuntime().getFreeMemory();
затем, как только свободная память опустится ниже определенного количества, вы можете начать удаление элементов. Или вы можете просто реализовать максимальный размер кэша и использовать его, чтобы решить, когда отбрасывать вещи.
здесь кэш LRU Я разработал с O (1) Время вставки, удаления и поиска, который имеет настраиваемое максимальное количество элементов. Если вы хотите кэш, это будет лучшее решение имхо, чем SoftHashMap.
softreferences-отличный способ создать растущий кэш. Поэтому идеальным решением будет использовать SoftHashMap вместе с регулярной фиксированный размер кэша. все вставки в кэш идут как в фиксированный кэш, так и в мягкую хэш-карту, чтобы ссылаться на что-то, просто посмотрите, есть ли это в мягкой хэш-карте (и обновите справочное время в кэше). таким образом, все ваши самые важные пункты (в соответствии с выбранной вами политикой LRU, MFU,...) никогда не будет удалены, потому что на них трудно ссылаться в кэше, но вы также будете держаться за больше вещей (без контроля политики), пока есть достаточная память.