값 개체에 대해서는 SoftReference
의 사용에 대해서는 질문이 있지만 키 개체에 대해서는 사용하지 않는 레거시 프로젝트에서 아래의 LRU 캐시 구현을 참조하십시오.지도에서 SoftReference 사용?
여기 애플리케이션 (OOM)에 도달하기에 OutOfMemory 관한 것이면
public class LRUCacheImpl<K, V> implements LRUCache<K, V> {
// SoftReference is used for a memory friendly cache.
// The value will be removed under memory shortage situations and
// the keys of the values will be removed from the cache map.
private final Map<K, SoftReference<V>> cache;
public LRUCacheImpl(final int cacheSize) {
// 'true' uses the access order instead of the insertion order.
this.cache = new LinkedHashMap<K, SoftReference<V>> (cacheSize, 0.75f, true) {
private static final long serialVersionUID = 1L;
@Override
protected boolean removeEldestEntry(Map.Entry<K, SoftReference<V>> eldest) {
// When to remove the eldest entry i.e. Least Recently Used (i.e. LRU) entry
return size() > cacheSize; // Size exceeded the max allowed.
}
};
}
@Override
public V put(K key, V value) {
SoftReference<V> previousValueReference = cache.put(key, new SoftReference<V>(value));
return previousValueReference != null ? previousValueReference.get() : null;
}
@Override
public V get(K key) {
SoftReference<V> valueReference = cache.get(key);
return valueReference != null ? valueReference.get() : null;
}
}
GC 부드럽게 도달 가능한 객체에 대한 메모리를 회수 구현이다. 동일한 논리를 적용하면 값에 대한 메모리 만 다시 계산해야합니다 (소프트 참조가 값 개체에만 생성됨).
그러나 여기가 내 질문은 키 오브젝트 앱 도달 OOM 한 번지도에서 제거하는 방법 대응이다
// SoftReference is used for a memory friendly cache. // The value will be removed under memory shortage situations and // the keys of the values will be removed from the cache map.
파일
의 시작 부분에있는 주석입니다. 열쇠도 소프트 레퍼런스가있는 으로 싸여서는 안됩니까?cache.put(new SoftReference<K>(key), new SoftReference<V>(value));
'Key' 그래서 키 소프트 심판 정말 많은 –
도움이되지 않습니다 당신은 전체 클래스를 게시하는 코드를 만드는 것은, 값에 비해 크기가 작아 질 것으로 예상? 'removeEldestEntry' 메쏘드는이 맵에있는 키의 수를'cacheSize'로 제한해야 함을 암시하지만, 어디서나 적용되는 것을 보지 못합니다. – Eran
@Eran 이것은 완전한 코드입니다. removeEldestEntry는 내부적으로 호출되는 반면에 조작은 – user3198603