0

クラスで何度も再利用する必要があるいくつかのオブジェクトがあるとします。個々のオブジェクトは大きくなる可能性があり、そのようなオブジェクトの数も非常に大きくなる可能性があります。このようなオブジェクトの非常に単純な例は、データベースのレコードです。

10 行ごとにデータベースに再度クエリを実行する代わりに、そのようなデータを HAshMap に格納すると、パフォーマンスが向上します。しかし、メモリに関しては非常に要求が厳しいです。

HashMap に多くのデータが含まれているのに、すべてを 1 つのメモリに保持できないのはどうしてでしょうか。オブジェクトをオンデマンドで提供できれば、それが最善でしょうか?

4

2 に答える 2

3

Least-Recently-UsedキャッシュにLRUベースのマップを使用し、オブジェクトがメモリに残る場所でキャッシュサイズの長さが固定されている場合 があります。

このようなマップをJavaで取得するのは簡単[LinkedHashMap][1]です。

final int MAX_ENTRIES = 100;
Map cache = new LinkedHashMap(MAX_ENTRIES+1, .75F, true) {
    // Returns true if this map should remove its eldest entry
    public boolean removeEldestEntry(Map.Entry eldest) {
        return size() > MAX_ENTRIES;
    }
};

Map同期させることもできます。

Map m = Collections.synchronizedMap(cache);
于 2013-02-24T15:17:21.383 に答える
1

通常、大きくなる可能性のあるキャッシュを実装する場合は、SoftReferenceを使用する必要があります。通常、次のようになります。

private final Map<KeyType, Reference<MyLargeObject>> cache =
    new HashMap<>();    // Or LinkedHashMap, as per Quoi's suggestion

public MyLargeObject getCachedValue(KeyType key) {
    Reference<MyLargeObject> ref = cache.get(key);
    return (ref != null ? ref.get() : null);
}

public void addToCache(KeyType key, MyLargeObject value) {
    cache.put(key, new SoftReference<MyLargeObject>(value));
}

SoftReferenceはオブジェクトを保持しますが、メモリが不足した場合にそのオブジェクトをガベージコレクションできるようにします。オブジェクトがガベージコレクションを取得した場合、SoftReference.get()はnullを返します。

于 2013-02-24T16:00:37.330 に答える