3

グアバのものを使用してCache<Key, Value>います。Key強く到達できなくなったときはいつでも、キャッシュ エントリをガベージ コレクションする必要があります (いつか...)。back からback へCacheBuilder.weakKeys()の参照がなければ、Usingはまさにそれを行います。ValueKey

この参照を弱くすることはできますが、これにより、いつでもValue非常に無効になる可能性があります。私はそれを扱うことができましたが、私はしたくないです。

を使用することもできますweakValues()が、私の値は短時間しか参照されないため、非常に早い段階でエビクションが発生する可能性があります。

を使用できるかもしれませんが、softValues()かなり壊れています。SoftReference

おそらく私は何か間違っている....正しい解決策は何ですか?

アップデート

私が必要とすることは、への参照をValueeachに入れるだけで達成できますが、私の管理下にないKeyため、これは不可能です。Keyもしそうなら、キャッシュも弱い参照も何も必要ありません。

このようにして、それぞれKeyが対応するValue到達可能性を維持しますが、これは問題ありません1。また、それぞれ Valueが到達可能な状態を維持しKeyますが、 への既存の参照が長く存在しないため、これは問題ありませんValue


1いくらか有効期限が切れる方が良いですが、必須ではありません。

4

4 に答える 4

2

残念ながら、これはephemeronsなしでは解決できません。

于 2012-07-16T22:34:54.147 に答える
1

Value-> Keyからのポインタは、他にValueを保持しているものがない限り重要ではありません。

キャッシュがキーをダンプすると、キーが収集されます。

System-> Cache-> Key <-Valueがある場合、Cacheがキーをドロップすると、System-> CacheKey<-Valueを取得します。キーからシステム(この例ではメモリルート)へのリンクが切断され、キーが回復されます。

于 2012-07-12T06:04:40.870 に答える
1

本当にweakKeysが必要な場合は、値からキーへの弱い参照を持つことが正しいことです。

それが適切でないと思われる場合は、何を達成しようとしているのかについて、さらに詳しい情報を提供してください。

于 2012-07-12T15:21:41.773 に答える
0

キーのコピーを作成し、それをマップのキーとして使用することは可能だと思いますか? 私はあなたが次のようなものを持っているかもしれないと思っています

Value v = SomeLibrary.giveMeSomething();
String k = v.getName();
String k1 = new String(k);
cache.put(k1,v);

これは、b/c k.equals(k1) および k != k1 で機能します。Key に使用されるタイプのコピーまたはクローンを作成できることを願っています (これはおそらく String ではありません)。

ただし、これにより、キーのライフサイクルが変更されます。これは、もはや Value のものではないためです。マップに配置した特定のオブジェクトのライフサイクルを制御できる場合は、問題ありません。

それはうまくいくと思いますか?

于 2012-07-23T08:11:59.703 に答える