1

キーと値がソフト参照であるキャッシュを実装したいと考えています。キャッシュに含まれるインスタンスの計算 (特に値) に時間がかかる可能性があり、参照されていないオブジェクトをキーまたは値として含むエントリが必要なためです。メモリが不足する可能性がある場合にのみ、ガベージコレクションを取得します。値に弱い参照を使用すると、参照されなくなるとすぐにガベージ コレクションが実行されますが、これは私がやりたいことではありません。

最初は、この例を使用しました。それは機能しますが、キャッシュインスタンスごとに単一のスレッドを作成するのは私を悩ませます.キーの強力な参照を使用し、キャッシュクラスのいくつかのメソッド呼び出しで自分で古いエントリを消去します(WeakHashMapのように)実行するリスクがある場合は(明らかに)機能しませんそれらを呼び出さないとメモリ不足になります。Guava を使用したかったのですが、MapMaker では論理的なソフト キーの使用が許可されなくなりました。これは、デフォルトの等価性が equals() メソッドではなく等価 (==) に基づいているため、同一のキーを再作成することは不可能であることを意味します。ただし、sebastien-lorber のコメントには同意します。

GuavaがSoftReferenceのequalsメソッドをオーバーライドしていれば、ソフトキーは理にかなっていると思います。Guava が「等価メカニズム」を使用していることを見てきましたが、ソフト参照の場合、defaultEquivalence はそのような場合を処理するために同一ではなく等値であるべきだと思います。

MapDB と JCS も調べました。

上で引用した例を変更したり、グアバを使用してソフト参照に基づいてキャッシュを作成したりするにはどうすればよいですか?

4

2 に答える 2

0

実際、Guava でソフトキーを再導入しました (バージョン 14 で削除されました) が、CacheBuilder では: https://code.google.com/p/guava-libraries/issues/detail?id=1845

次に、== の代わりに equals() を使用してキーを比較するために、非パブリック メソッド CacheBuilder.keyEquivalence(Equivalence.equals()) を呼び出す必要があります。それが機能するかどうかをお知らせします。この場合、私は自分の答えを受け入れます。それ以外の場合は、maaartinus の提案を使用する必要があります。

于 2014-09-05T14:14:17.907 に答える