【问题标题】:Google Guava Cache evicting entries for SIZE when no maxSize specified未指定 maxSize 时,Google Guava Cache 逐出 SIZE 条目
【发布时间】: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&lt;? extends V&gt; 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 问题。
  • 嘘。进一步的问题:您使用的是哪个版本的番石榴?我正在查看源代码,这似乎完全不可能。

标签: java guava


【解决方案1】:

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

【讨论】:

  • 哦。我什至没有想到这一点;实际上,这似乎很可能。
  • 就是这样。我忽略了将过期设置为“0”与“maximumSize(0)”同义。我现在将过期设置为 Long.MAX_VALUE 虽然我怀疑规范的解决方案是使用 Ticker。想法?
  • 股票代码仅用于测试目的。与其将到期时间设置为 MAX_VALUE,不如说您根本不应该设置它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多