Guava缓存是否考虑了驱逐选择中的重量?

时间:2012-03-29 18:51:00

标签: java caching guava

优秀的Guava库的最新版本更新了缓存apis。 CacheBuilder现在有一个maxmimumWeight()方法来强制缓存的最大权重。 javadoc声明:

  

指定缓存可能包含的条目的最大权重。重量   使用Weigher指定的Weigher确定,并使用   这种方法需要在调用之前对称重器进行相应的调用   建立(com.google.common.cache.CacheLoader)。

     

请注意,缓存可能会在超出此限制之前逐出条目。   随着缓存大小接近最大值,缓存逐出条目   不太可能再次使用。例如,缓存可以   因为最近或经常没有使用它而逐出一个条目。

当Cache需要逐出一个条目时,它会考虑权重吗?例如,如果较大的重量条目比任何小项目更频繁地使用,那么保留几个重量小于一个大重量条目的条目可能会更好,但是比所有小项目更少。

1 个答案:

答案 0 :(得分:13)

番石榴团队成员。

  

当缓存大小接近最大值时,缓存会逐出不太可能再次使用的条目。例如,缓存可能会逐出条目,因为它最近或者经常没有使用过。

如果缓存有任何其他行为,则没有记录(并且不应该依赖)。也就是说,如果你看一下the source,目前的实现关心最近访问的内容:

while (totalWeight > maxSegmentWeight) {
  ReferenceEntry<K, V> e = getNextEvictable();
  if (!removeEntry(e, e.getHash(), RemovalCause.SIZE)) {
    throw new AssertionError();
  }
}

getNextEvictable按最近最少访问的顺序进行迭代。