7

指定された条件が返された場合にのみオブジェクトをガベージコレクターに送信できる弱参照をJavaで作成することは可能trueですか?

ID番号をいくつかのデータにマップするキャッシュのようなものがあるとしましょう:

Map<Integer, SomeData> cache = new HashMap<>();

SomeDatavoid updateTime()内部変数を現在の時刻に設定するだけの と、過去 10 分間にオブジェクトが使用されたかどうかをチェックする2 つの重要なメソッドがboolean canBeDeleted()あります (現在の時刻と保存された時刻に 10 分を加えたものを比較するだけです)。この一定時間使用されていない場合、メソッドは戻りtrue、オブジェクトをキャッシュから削除できます...

ただし、強い参照ではなく弱い参照でキャッシュを作成すると、次のようになります。

Map<Integer, WeakReference<SomeData>> cache = new HashMap<>();

次に、WeakReferenceチェックする唯一のものは、おそらくオブジェクトへの強い参照の可能性ですが、それが私の状態もチェックし、canBeDeleted()それが返された場合は参照を削除しなかったことを望みますfalse. これを行う方法はありますか?

(その上、メモリ リークがあり、それを解決する方法がわかりません... WeakReference 内のオブジェクトが削除されると、マップには不要なキーと値のペアがまだ含まれています)。

前もって感謝します。

4

2 に答える 2

2

LinkedHashMap#removeEldestEntryを使用できますが、エントリがキャッシュ内にある時間に基づいて削除する方法は提供されません。アクセスされたかどうかに基づいてエントリを削除する方法は提供されます。

新しいエントリが追加されるたびに、最も古いエントリを削除する機会を実装者に提供します。これは、マップがキャッシュを表す場合に便利です。古いエントリを削除することで、マップのメモリ消費を減らすことができます。

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
  return size() > limit;

また、LinkedHashMap を で初期化する必要があることも忘れないでくださいaccessOrder true

accessOrder - 順序付けモード - アクセス順の場合は true、挿入順の場合は false。

したがって、すべてをまとめると、ソースは次のようになります

public class Cache<K, V> extends LinkedHashMap<K, V> {
    private final int MAX_ENTRIES = 100;
    public Cache() {
        super(16, 0.75f, true);// accessOrder is true
    }
    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > MAX_ENTRIES;
    }
}
于 2012-10-19T10:02:54.860 に答える
0

条件が true のキャッシュ内のキーを削除するだけです。

于 2012-10-19T09:48:09.130 に答える