利用可能なRAMの割合を使用して、Javaでオブジェクトをキャッシュする必要があります。他の人がこの質問をしたことは承知していますが、どの回答も私の要件を満たしていません。
私の要件は次のとおりです。
- シンプルで軽量
- プレーンな HashMap よりも劇的に遅くない
- LRU、または LRU に近い削除ポリシーを使用する
LinkedHashMap を試してみましたが、要素の最大数を指定する必要があり、使用可能な RAM をいっぱいにするのに必要な要素の数がわかりません (サイズは大きく異なります)。
私の現在のアプローチは、Google コレクションの MapMaker を次のように使用することです。
Map<String, Object> cache = new MapMaker().softKeys().makeMap();
これは、より多くの RAM が必要なときに要素を自動的に削除する必要があるため、魅力的に思えましたが、重大な問題があります。その動作は、利用可能なすべての RAM をいっぱいにすることであり、その時点で GC がスラッシングし始め、アプリ全体のパフォーマンスが劇的に低下します。
EHCache のようなものについて聞いたことがありますが、必要なものに対して非常に重いようで、アプリケーションにとって十分に高速かどうかはわかりません (ソリューションが HashMap よりも劇的に遅くなることはあり得ないことを思い出してください)。 .