Текущий алгоритм выселения для карт довольно ленив. Похоже, объекты с истекшим сроком действия удаляются только при обращении к структуре данных.
Например, сопоставление адресов с индексаторами, определенное как:
ConcurrentMap<Address, Indexer> indexers = new MapMaker()
.expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
.evictionListener( new IndexEvicted())
.makeMap();
приводит к довольно удивительной закономерности: в то время как containsKey()
для данного адреса возвращает false, сразу после того, как этот индексатор для этого адреса выселен.
Каков будет рекомендуемый подход, чтобы сделать процесс очистки более оперативным? То есть удалить объекты, близкие к фактическому времени истечения.
Обновление: Я бы хотел уточнить, что я имею в виду в режиме реального времени. Для приведенного выше примера, EXPIRATION составляет 10 секунд, я бы хотел, чтобы вставленный объект выселился через 10 секунд после последнего доступа. Этого сейчас не происходит - карту нужно использовать как-то, чтобы начать выселение. Если карта полностью не используется, объект может оставаться там годами.