문제

나는 거기에 있다는 것을 안다 WeakHashMap ~에 java.util, 하지만 사용하기 때문에 WeakReferences는 이것에 의해서만 참조되는 모든 것에 대한 것입니다. Map, 참조된 개체는 다음 GC 주기에서 손실됩니다.따라서 나머지 시간 동안 하드 링크되지 않고 다시 요청될 가능성이 매우 높은 임의 데이터를 캐시하려는 경우 거의 쓸모가 없습니다.가장 좋은 솔루션은 다음을 사용하는 지도입니다. SoftReference대신 Java RT 패키지에서 찾지 못했습니다.

도움이 되었습니까?

해결책

편집 (2012 년 8 월) :

현재 가장 좋은 솔루션은 아마도 구아바 13.0 년대 일 것입니다. Cache 수업, 설명 구아바의 위키 - 그게 제가 사용할 것입니다. 건물조차도 a SoftHashMap (보다 CacheBuilder.newBuilder().softKeys()), 그러나 Java Expert Jeremy Manson이 설명 하듯이 (아래에서 링크를 찾을 수 있듯이) 아마도 당신이 원하는 것은 아닙니다.


하지 그 나는 알고있다 (2008 년 11 월), 그러나 당신은 어떤 구현을 찾습니다. SoftHashMap 그물에.

이 같은: SoftHashMap 또는 이 하나.


편집 (2009 년 11 월)
처럼 마티아스 의견에 언급된다 Google Guava 맵 메이커 SofTreferences를 사용합니다.

ConcurrentMap 이러한 기능의 조합을 제공하는 빌더 :

  • 부드럽거나 약한 키,
  • 부드럽거나 약한 값,
  • 시간이 완료되었습니다
  • 주문형 값 계산.

언급했듯이 이 스레드, 또 다른 JSR166Y 후보 :

JSR166Y.CONCURRENTREFERINESHASHMAP

Google 구현에 대한 대체 동시 참조 맵을 제공합니다 (배경 스레드에 의존하여 항목을 퇴거시킵니다).


편집 (2012 년 8 월)

Google 구현은 항목의 시간 만료가 요청 된 경우에만 백그라운드 스레드를 사용합니다. 특히 단순히 사용합니다 java.util.Timer, 이것은 별도의 배경 스레드를 갖는 것만 큼 방해가되지 않습니다.

Jeremy Manson은 모든 캐시에 대해이 기능을 사용하여 Softreference의 위험을 피할 것을 권장합니다.http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html

또 다른 구현이 있습니다 아파치 커먼즈, 즉 org.apache.commons.collections.map.referencemap; 시간 제거를 지원하지는 않지만 키를 신원 또는 평등으로 비교 해야하는지 여부를 선택하는 것이 지원됩니다. 또한,이 구현은 동시에 동시에 만들어지지 않지만 동기화 될 수 있지만 여러 스레드의 액세스 하에서 덜 잘 작동합니다.

다른 팁

SofthashMap 구현을 제공하는 두 개의 라이브러리에 익숙합니다.

  1. 아파치 커먼즈: org.apache.commons.collections.map.referencemap

  2. Google 컬렉션: com.google.common.collect.referencemap

예제 구현이 있습니다 Java Specialists 뉴스 레터의 98 호

아파치 시로 캐싱 용으로 설계된 SofthashMap이 함께 제공됩니다. 위의 JB가 게시하고 Apache V2에 따라 라이센스가 부여 된 기사를 기반으로합니다. 문서를 찾을 수 있습니다 여기 그리고 소스 코드 여기.

사용을 고려 했습니까? lrumap 소프트 해시 맵 대신? 당신은 저장되는 내용 (또는 적어도 얼마나 많은지)를 더 많이 통제 할 수 있습니다.

캐시 소프트 참조를 구현하려는 경우 약한 참조보다 확실히 더 나은 아이디어이지만 전체 캐시 제거 정책을 가비지 수집기의 손에 맡깁니다.아마도 당신이 원하는 것이 아닐 것입니다.

캐시 제거 정책이 중요한 경우 일반 참조를 사용하여 직접 수행해야 할 가능성이 높습니다.그러나 항목을 꺼낼 시기와 꺼낼 항목을 결정해야 합니다.힙 공간이 부족할 때만 항목을 잃고 싶다면 다음을 통해 사용 가능한 힙 공간을 쿼리할 수 있습니다.

Runtime.getRuntime().getFreeMemory();

그런 다음 여유 메모리가 특정 양 아래로 떨어지면 항목 삭제를 시작할 수 있습니다.또는 캐시의 최대 크기를 구현하고 이를 사용하여 항목을 삭제할 시기를 결정할 수도 있습니다.

여기 있어요 LRU 캐시 나는 구성 가능한 최대 요소 수를 갖는 O(1) 삽입, 삭제 및 조회 시간으로 설계했습니다.캐시를 원한다면 이것이 SoftHashMap보다 더 나은 솔루션이 될 것입니다.

소프트참조는 확장 가능한 캐시를 생성하는 좋은 방법입니다.따라서 이상적인 솔루션은 일반 고정 크기 캐시와 함께 SoftHashMap을 사용하는 것입니다.캐시에 대한 모든 삽입을 고정 캐시와 소프트 해시 맵 모두로 이동시킨 다음 무언가를 참조하여 소프트 해시맵에 있는지 확인하고 캐시에서 참조 시간을 업데이트합니다.이렇게 하면 가장 중요한 모든 항목(선택한 정책 LRU, MFU 등에 따라)은 캐시에서 하드 참조되기 때문에 절대 제거되지 않지만 더 많은 항목(정책 제어 없이)을 오랫동안 유지하게 됩니다. 메모리가 충분하기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top