【发布时间】:2012-06-11 23:13:21
【问题描述】:
我正在使用 Google Guava CacheBuilder 创建一个 Cache 实例。我的代码如下所示:
return CacheBuilder.newBuilder()
.initialCapacity(initialCapacity)
.expireAfterAccess(expirationInterval, TimeUnit.SECONDS)
.removalListener(LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER)
.build();
顾名思义,我的移除监听器是:
private static final RemovalListener<MyKey, MyRecord> LOGGING_AUTOEVICTION_ONLY_REMOVAL_LISTENER
= new RemovalListener<MyKey, MyRecord>() {
@Override
public void onRemoval(RemovalNotification<MyKey, MyRecord objectObjectRemovalNotification) {
if (objectObjectRemovalNotification.wasEvicted()) {
log.debug("Entry evicted from cache: {} - Reason: {}", objectObjectRemovalNotification, objectObjectRemovalNotification.getCause());
}
}
};
最后,我只在缓存中使用了get 条目,使用get(K key, Callable<? extends V> valueLoader)
问题出在:使用上面的代码,我看到以下日志输出:
19:08:03.287 DEBUG [MyCache] - Entry evicted from cache: MyKey[123]=MyRecord@43ee148b - Reason: SIZE
当我在 CacheBuilder 调用中没有使用 maximumSize() 时,为什么记录会从我的缓存中被逐出?我怀疑这与“体重”有关。如果是这样,我需要了解maxWeight() 的哪些信息才能在到期时间之前不驱逐缓存条目?
注意我知道 Google Guava 网站上的 Caches Explained。
【问题讨论】:
-
不,这不应该发生,无论重量如何。您能否构建一个 SSCCE 来证明该错误?
-
此外,这似乎更适合作为错误报告而不是作为 SO 问题。
-
嘘。进一步的问题:您使用的是哪个版本的番石榴?我正在查看源代码,这似乎完全不可能。