Я вижу ниже реализацию кэша LRU в устаревшем проекте, где у меня есть вопрос об использовании SoftReference
для объекта value, но не для ключевого объекта.Использование SoftReference в Map?
Вот реализация
public class LRUCacheImpl<K, V> implements LRUCache<K, V> {
// SoftReference is used for a memory friendly cache.
// The value will be removed under memory shortage situations and
// the keys of the values will be removed from the cache map.
private final Map<K, SoftReference<V>> cache;
public LRUCacheImpl(final int cacheSize) {
// 'true' uses the access order instead of the insertion order.
this.cache = new LinkedHashMap<K, SoftReference<V>> (cacheSize, 0.75f, true) {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Map.Entry<K, SoftReference<V>> eldest) {
// When to remove the eldest entry i.e. Least Recently Used (i.e. LRU) entry
return size() > cacheSize; // Size exceeded the max allowed.
}
};
}
@Override
public V put(K key, V value) {
SoftReference<V> previousValueReference = cache.put(key, new SoftReference<V>(value));
return previousValueReference != null ? previousValueReference.get() : null;
}
@Override
public V get(K key) {
SoftReference<V> valueReference = cache.get(key);
return valueReference != null ? valueReference.get() : null;
}
}
ГХ высвобождает память для мягко достижимых объектов, если приложение о том, чтобы достичь OutOfMemory (OOM). Если я применяю ту же логику, только память для значения должна быть восстановлена (поскольку мягкая ссылка создается только для объекта значения).
Но вот комментарий в начале файла
// SoftReference is used for a memory friendly cache. // The value will be removed under memory shortage situations and // the keys of the values will be removed from the cache map.
Мой вопрос, как соответствующий ключевой объект будет удален с карты один раз приложение рич ООМ. Не следует ли обертывать ключ с мягкой ссылкой?
cache.put(new SoftReference<K>(key), new SoftReference<V>(value));
'Key' ожидает быть меньше по размеру по сравнению с величиной, поэтому делает ключ, как мягкий исх не помогает много –
ли коду, который вы разместили полный класс? Метод 'removeEldestEntry' подразумевает, что количество ключей на этой карте должно быть ограничено' cacheSize', но я не вижу, чтобы это принудительно выполнялось где угодно. – Eran
@Eran Это полный код. removeEldestEntry вызывается внутренне, а операция put – user3198603