当前的地图驱逐算法非常懒惰。看起来过期的对象只有在访问数据结构时才会被驱逐。
例如,从地址到索引器的映射定义为:
ConcurrentMap<Address, Indexer> indexers = new MapMaker()
.expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
.evictionListener( new IndexEvicted())
.makeMap();
导致非常令人惊讶的模式:虽然containsKey()
对于给定的地址返回 false,但在该地址的索引器被驱逐后立即返回。
使清理过程更加实时的推荐方法是什么?即删除接近实际到期时间的对象。
更新:我想更清楚地说明我所说的实时是什么意思。对于上面的示例, EXPIRATION 为 10 秒,我希望看到插入的对象在最后一次访问后 10 秒内被驱逐。现在不会发生这种情况 - 必须以某种方式使用地图来开始驱逐。如果地图完全未使用,则该对象可以在那里停留数年。