JavaにSoftHashMapはありますか?
-
06-07-2019 - |
質問
java.util
に WeakHashMap
があることは知っていますが、すべてに WeakReference
を使用しているため、これだけが参照します Map
、参照オブジェクトは次のGCサイクルで失われます。したがって、ランダムデータをキャッシュする場合はほとんど役に立たないため、残りの時間はハードリンクされずに再度要求される可能性が非常に高くなります。最良の解決策は、代わりに SoftReference
sを使用するマップですが、Java RTパッケージには見つかりませんでした。
解決
編集(2012年8月):
現時点で最良のソリューションは、おそらく SoftHashMap
の構築もサポートしています( CacheBuilder.newBuilder()。softKeys()
を参照)リンクがあります)。
知っているではありませんが(2008年11月)ネットで SoftHashMap
の実装を見つけてください。
このように: SoftHashMap
またはこれ。
編集(2009年11月)
Matthias がコメントで言及しているように、 Google Guava MapMaker はSoftReferencesを使用します:
ConcurrentMap
ビルダー。これらの機能の任意の組み合わせを提供します:
- ソフトキーまたは弱いキー、
- ソフトまたは弱い値、
- 期限切れ、および
- 値のオンデマンド計算。
このスレッド、別のJSR166y候補:
jsr166y.ConcurrentReferenceHashMap
Google実装への代替の同時参照マップを提供します(エントリを削除するためにバックグラウンドスレッドに依存します)
編集(2012年8月)
Googleの実装では、エントリの期限切れが要求された場合にのみバックグラウンドスレッドを使用します。特に、単純に java.util.Timer
を使用します。これは、独立したバックグラウンドスレッドを持つほど侵入的ではありません。
Jeremy Mansonは、すべてのキャッシュについて、SoftReferenceの危険を回避するためにこの機能を使用することをお勧めします。 http://jeremymanson.blogspot.de/2009/ 07 / how-hotspot-decides-to-clear_07.html
Apache Commons からの別の実装、つまり org.apache.commons.collections.map.ReferenceMap ;定期的な削除はサポートしていませんが、キーをIDと同等のどちらで比較するかを選択することはできます。さらに、この実装は同時ではありません-同期させることはできますが、複数のスレッドからのアクセスではうまく機能しません。
他のヒント
SoftHashMap実装を提供する2つのライブラリに精通しています。
-
Apache Commons :org.apache.commons.collections.map.ReferenceMap
-
Googleコレクション:com.google.common.collect.ReferenceMap
HashMapの代わりにLRUMap ?何を保存するか(少なくとも、どれだけ)をより詳細に制御できます。
キャッシュを実装する場合、ソフト参照は弱い参照よりも明確に優れたアイデアですが、キャッシュ削除ポリシー全体をガベージコレクターの手に委ねます。これはおそらくあなたが望むものではありません。
キャッシュ削除ポリシーが重要な場合は、通常の参照を使用して独自にそれを行う必要があります。ただし、アイテムをイジェクトするタイミングとイジェクトするタイミングを決定する必要があります。ヒープ領域が不足しているときにのみ物を失いたい場合は、次の方法で利用可能なヒープ領域を照会できます。
Runtime.getRuntime().getFreeMemory();
その後、空きメモリが一定量を下回ると、アイテムのドロップを開始できます。または、キャッシュの最大サイズを実装し、それを使用していつドロップするかを決定することもできます。
LRUキャッシュ O(1)の挿入、削除、およびルックアップ時間で設計されており、構成可能な最大要素数があります。キャッシュが必要な場合は、SoftHashMapよりも優れたソリューションになります。
ソフト参照は、拡張可能なキャッシュを作成するための優れた方法です。したがって、SoftHashMapと通常の固定サイズのキャッシュを使用することが理想的なソリューションです。キャッシュへのすべての挿入は、固定キャッシュとソフトハッシュマップの両方に送られ、ソフトハッシュマップにあるかどうかを確認するだけで参照できます(そしてキャッシュの参照時間を更新します)。このようにして、最も重要なすべてのアイテム(選択したポリシーLRU、MFUなど)はキャッシュ内でハード参照されるため削除されませんが、(ポリシーの制御なしで)さらに多くのものを保持します十分なメモリがあるため。