【问题标题】:Do Guava caches consider weight in eviction choices?Guava 缓存是否在驱逐选择中考虑权重?
【发布时间】:2012-03-30 03:19:35
【问题描述】:

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

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

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

当缓存需要驱逐一个条目时,它会考虑权重吗?例如,如果大权重条目的使用频率高于任何小项目,但比所有小项目一起使用的频率低,那么保留多个小权重条目可能比保留一个大权重条目更好。

【问题讨论】:

标签: java caching guava


【解决方案1】:

Guava 团队成员在这里。

随着缓存大小接近最大值,缓存会驱逐不太可能再次使用的条目。例如,缓存可能会驱逐一个条目,因为它最近或不经常使用。

如果缓存有任何其他行为,则不会记录在案(也不应依赖)。也就是说,如果您查看the source,当前实现关心最近访问的:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多