java - 未指定 maxSize 时,Google Guava Cache 逐出 SIZE 条目

标签 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

当我没有使用 maximumSize() 时,为什么记录会从我的缓存中被逐出?在 CacheBuilder 调用中?我怀疑这与“重量”有关。如果是这样,关于 maxWeight() 我需要了解什么?在过期时间之前不清除缓存条目?

注意 我知道 Caches Explained在谷歌 Guava 网站上。

最佳答案

您的 expirationInterval 是否有可能意外地等于零?正如 expireAfterAccess 文档所述,“当 duration 为零时,此方法将交给 maximumSize(0)。”

关于java - 未指定 maxSize 时,Google Guava Cache 逐出 SIZE 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10988661/

相关文章:

java - 在多线程环境中并行执行每个子任务

java - Java POJO 是否应该在 setter 方法中进行字段验证和抛出异常?

java - 如何在日志文件中显示异常原因的详细信息

java - 错误消息 “Illegal Start of Expression”?

java - ImmutableList vs List-我应该将其转换为什么?

java - 从 google HashMultimap 访问元素时出现问题

java - Mapstruct,从多个输入参数映射到嵌套对象

java - Eclipse GEF 中的父级和子级人物

java - 多图空间问题 : Guava

java - Google Collections 相当于 Apache Commons Collections ArrayUtils.toObject 和 ArrayUtils.toPrimitive