Я реализую простой кэш, используя LinkedHashMap
на основе найденных инструкций здесь . Я использую следующий код:
public class Cache extends LinkedHashMap {
private final int capacity;
public Cache(int capacity) {
super(capacity + 1, 1.1f, true);
this.capacity = capacity;
}
protected boolean removeEldestEntry(Entry eldest) {
return size() > capacity;
}
}
Это очень просто. Однако это просто накладывает фиксированный размер на карту. Я работаю на очень маленькой куче, и в зависимости от размера кэшируемых объектов и выбранной мной емкости это может все еще не хватать памяти. Объекты произвольны, и поэтому я не могу оценить, насколько они велики. Я не хочу зависеть от SoftReferences
для очистки кэша, потому что способ очистки этих данных ненадежен; он изменяется от ВМ к ВМ, и они могут либо быть восстановлены слишком рано, либо они могут никогда не быть восстановлены, пока не заполнят мою кучу.
Можно ли как-нибудь контролировать размер карты и ограничивать ее на основании этого?