Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 番石榴中驱逐的懒惰';s地图_Java_Hashmap_Guava_Concurrenthashmap - Fatal编程技术网

Java 番石榴中驱逐的懒惰';s地图

Java 番石榴中驱逐的懒惰';s地图,java,hashmap,guava,concurrenthashmap,Java,Hashmap,Guava,Concurrenthashmap,当前的地图逐出算法相当懒惰。看起来只有在访问数据结构时才会逐出过期的对象 例如,从地址到索引器的映射定义为: ConcurrentMap<Address, Indexer> indexers = new MapMaker() .expireAfterAccess( EXPIRATION, TimeUnit.SECONDS) .evictionListener( new IndexEvicted()) .makeMap(); ConcurrentMap indexer=n

当前的地图逐出算法相当懒惰。看起来只有在访问数据结构时才会逐出过期的对象

例如,从地址到索引器的映射定义为:

ConcurrentMap<Address, Indexer> indexers = new MapMaker()
  .expireAfterAccess( EXPIRATION, TimeUnit.SECONDS)
  .evictionListener( new IndexEvicted())
  .makeMap();
ConcurrentMap indexer=newmapmaker()
.expireAfterAccess(过期,时间单位为秒)
.ReceivingListener(新IndexEvented())
.makeMap();
这导致了一种非常令人惊讶的模式:给定地址的
containsKey()
在该地址的索引器退出后立即返回false

为使清理过程更加实时,建议采用什么方法?即移除接近实际到期时间的物体


更新:我想进一步澄清我所说的实时是什么意思。对于上面的示例,过期时间为10秒,我希望看到插入的对象在最后一次访问后的10秒内被逐出。这种情况现在没有发生——必须以某种方式使用地图来开始驱逐。如果地图完全未使用,对象可以在那里停留数年。

除了
expireAfterAccess
之外,还有一个
expireAfterWrite
方法。这很可能符合要求

发件人:

指定每个条目在创建或替换后经过固定的持续时间后,应自动从映射中删除。请注意,更改条目的值将重置其过期时间


注意:
expireAfterAccess
expireAfterWrite
都是“实时”的,只是其中一个根据元素的上次写入时间过期,另一个根据元素的上次访问时间过期。

为了及时收回,Guava需要实现某种后台线程或定时循环任务。这样做会使映射更重,更难在J2EE等环境中使用,或者在安全策略防止随意生成线程的环境中使用

如果您关心及时驱逐,请设置您自己的定时线程,以接触地图


另一方面,我同意垃圾收集器触发驱逐会很好。。。例如,通过使用SoftReference和终结器。(是的,我知道终结器大多是邪恶的,我只是建议一种可选的最后手段策略。)

虽然Dilum的回答最有意义,但也要注意,用自动逐出操作数据结构将不必逐出所有过期的条目。大多数过期发生在相对较小的批中,因此,如果同时有大量过期,则可能需要多次接触数据结构。不幸的是,我不认为有一种简单的编程方法可以可靠地做到这一点。

这对我来说是不可能的。我更新了这个问题,以澄清我所说的实时是什么意思。这是我现在的方法。不过看起来有点像黑客。只是想知道推荐(官方)的方法是什么。这是基于经验还是对番石榴的了解?你能详细说明一下这些批次以及它们背后的逻辑吗?我已经根据这个问题和你的回答提出了一个问题。请在有机会的时候查看:我的评论是基于在我经历了这个问题中提到的一些问题之后阅读了实际的番石榴代码。+1是的-我已经了解了
CustomConcurrentHashMap
是如何被划分为段的,从而导致了这种行为。有关思考过程,请参见我的链接问题。仅供参考,我根据这篇文章及其回答提出了一个问题: