未指定maxSize时,Google Guava Cache会清除SIZE的条目

时间:2012-06-11 23:13:22

标签: java guava

我正在使用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

1 个答案:

答案 0 :(得分:7)

您的expirationInterval是否可能意外地等于零?作为expireAfterAccess文档,“当duration为零时,此方法将移至maximumSize(0)。”