当前的地图驱逐算法相当懒惰。看起来过期的对象只有在访问数据结构时才会被驱逐。
例如,从地址到索引器的映射定义为:
ConcurrentMap<Address, Indexer> indexers = new MapMaker()
.expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
.evictionListener( new IndexEvicted())
.makeMap();
导致相当令人惊讶的模式:而containsKey()
在该地址的索引器被逐出后,给定地址立即返回 false。
使清理过程更加实时的推荐方法是什么? IE。删除接近实际过期时间的对象。
Update:我想进一步澄清实时的含义。对于上面的示例,EXPIRATION 为 10 秒,我希望看到插入的对象在上次访问后 10 秒内被逐出。现在这种情况还没有发生——必须以某种方式使用地图来开始驱逐。如果地图完全未使用,该物体可能会在那里停留数年。
为了及时驱逐,Guava 需要实现某种后台线程或定时重复任务。这样做会使映射变得更重,并且更难以在 J2EE 等环境或安全策略阻止随意生成线程的环境中使用。
如果您关心及时驱逐,请设置您自己的接触地图的定时线程。
另一方面,我确实同意让垃圾收集器触发驱逐会很好......例如通过使用 SoftReference 和终结器。 (是的,我知道终结器大多是邪恶的,我只是建议一种可选的最后手段策略。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)