优秀的Guava库的最新版本更新了缓存apis。 CacheBuilder现在有一个maxmimumWeight()方法来强制缓存的最大权重。 javadoc声明:
指定缓存可能包含的条目的最大权重。重量 使用Weigher指定的Weigher确定,并使用 这种方法需要在调用之前对称重器进行相应的调用 建立(com.google.common.cache.CacheLoader)。
请注意,缓存可能会在超出此限制之前逐出条目。 随着缓存大小接近最大值,缓存逐出条目 不太可能再次使用。例如,缓存可以 因为最近或经常没有使用它而逐出一个条目。
当Cache需要逐出一个条目时,它会考虑权重吗?例如,如果较大的重量条目比任何小项目更频繁地使用,那么保留几个重量小于一个大重量条目的条目可能会更好,但是比所有小项目更少。
答案 0 :(得分:13)
番石榴团队成员。
当缓存大小接近最大值时,缓存会逐出不太可能再次使用的条目。例如,缓存可能会逐出条目,因为它最近或者经常没有使用过。
如果缓存有任何其他行为,则没有记录(并且不应该依赖)。也就是说,如果你看一下the source,目前的实现只关心最近访问的内容:
while (totalWeight > maxSegmentWeight) {
ReferenceEntry<K, V> e = getNextEvictable();
if (!removeEntry(e, e.getHash(), RemovalCause.SIZE)) {
throw new AssertionError();
}
}
和getNextEvictable
按最近最少访问的顺序进行迭代。