弱参照もソフト参照も、これにはあまり適していません。WeakReferences は、オブジェクトに強力な参照がなくなるとすぐにクリアされる傾向があり、ソフト参照は、ヒープが最大サイズに成長した後、またはそれ以外の場合に OutOufMemoryError をスローする必要がある場合にのみクリアされます。
通常、参照サブクラスよりもVMにとってはるかに安価な定期的な強力な参照を使用した時間ベースのアプローチを使用する方が効率的です(プログラムとGCの処理が速く、参照自体に余分なメモリを使用しません)。つまり、一定時間使用されていないすべてのオブジェクトを解放します。これは、参照キューを操作するためにとにかく必要な定期的な TimerTask で確認できます。つまり、オブジェクトの作成に 10 ミリ秒かかり、最後に使用してから 1 秒以内に保持すると、すべてのオブジェクトを永久に保持する場合よりも平均で 1% 遅くなるだけです。ただし、使用するメモリが少ない可能性が高いため、実際には高速になります。
編集:これを実装する 1 つの方法は、内部で 3 つのバケットを使用することです。キャッシュに配置されるオブジェクトは、常にバケット 0 に挿入されます。オブジェクトが要求されると、キャッシュは 3 つのバケットすべてを順番に検索し、まだ存在しない場合はバケット 0 に配置します。TimerTask は一定の間隔で呼び出され、バケット 2 をドロップし、バケット リストの先頭に新しい空のバケットを配置するだけで、新しいバケット 0 が空になり、以前のバケット 0 が 1 になり、以前のバケット 1 がバケットになります。 2. これにより、アイドル状態のオブジェクトが少なくとも 1 回、多くても 2 回のタイマー間隔で存続し、間隔ごとに複数回アクセスされるオブジェクトの取得が非常に高速になることが保証されます。このようなデータ構造の総メンテナンス オーバーヘッドは、参照オブジェクトと参照キューに基づくすべてのものよりもかなり小さくなります。