4

GoogleGuavaを使用してインスタンス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()もしそうなら、有効期限の前にキャッシュエントリを削除しないようにするために何を知る必要がありますか?

GoogleGuavaサイトで説明されているキャッシュを知っています。

4

1 に答える 1

7

あなたexpirationIntervalが誤ってゼロに等しい可能性はありますか? expireAfterAccessドキュメントとして、「durationがゼロの場合、このメソッドは にハンドオフしmaximumSize(0)ます。」

于 2012-06-12T00:59:16.450 に答える