ProgramingTip

Java에 SoftHashMap이 있습니까?

bestdevel 2020. 11. 25. 08:13
반응형

Java에 SoftHashMap이 있습니까?


WeakHashMap에서 이 있다는 것을 알고 java.util있지만 WeakReference이에 의해서만 참조되는 모든 것에의를 사용하기 때문에 Map참조 된 object-는 다음 GC주기에서 손실됩니다. 그러나 나머지 시간 동안 하드 링크되지 않고 다시 요청 될 가능성이 높은 임의 데이터를 캐시하려는 경우 거의 쓸모가 없습니다. 가장 좋은 해결책은 SoftReferences를 대신 사용하는 맵 이지만 Java RT 패키지에서 찾을 수 있습니다.


편집 (2012 년 8 월) :

현재 최상의 솔루션은 아마도 Guava의 WikiCache 에 설명 된 Guava 13.0의 클래스 일 것입니다. 이것이 제가 사용할 것입니다. 빌드를 지원 SoftHashMap(참조 CacheBuilder.newBuilder().softKeys())하지만 Java 전문가 Jeremy Manson이 설명했듯이 (아래에서 링크를 사용할 수 있음) 원하는 것이 아닐 수도 있습니다.


하지 않는 것이 내가 알고 (2008 년 11 월),하지만 당신은 종류의 일부 구현을 찾아 SoftHashMap그물에 있습니다.

이것처럼 : 또는 이것 .SoftHashMap


편집 (2009 년 11 월) Matthias 가 의견에서 언급
했던 Google Guava MapMaker 는 SoftReferences를 사용합니다.

ConcurrentMap다음 기능의 조합을 제공 하는 빌더 :

  • 소프트 키 또는 약한 키,
  • 약하거나 약한 값,
  • 시간 및 종료
  • 주문형 값 계산.

이 유명한 에서 언급했듯이 다른 JSR166y 후보 :

jsr166y.ConcurrentReferenceHashMap

Google 구현에 대한 대체 동시 참조 맵을 제공합니다 (항목을 제거하기 위해 백그라운드에 의존).


편집 (2012 년 8 월)

Google 구현은 항목의 비용이 요청 된 경우에만 시간을 사용합니다. 특히, java.util.Timer비록 많은 방해가없는 것을 사용 합니다.

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

Apache Commons 의 또 다른 구현 , 즉 org.apache.commons.collections.map.ReferenceMap ; 시간 제한 제거를 지원하지 않지만, ID 또는 동등성으로 선택할 수 있습니다. 더욱이이 구현은 동시 적이 지입니다. 동기화 할 수 있습니다.


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

  1. Apache Commons : org.apache.commons.collections.map.ReferenceMap

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


자바 전문가 뉴스 레터 98 호에 구현 사례가 있습니다.


Apache Shiro 는 캐싱 용으로 SoftHashMap과 함께 제공됩니다. 위의 jb가 게시하고 Apache v2에 따라가 부여한 기사를 기반으로합니다. 여기에 소스 코드 를 사용할 수 있습니다 .


소프트 HashMap 대신 LRUMap 사용을 고려해 보거나 ? 저장 항목 (또는 최소한 얼마만큼)을 더 많이 제어 할 수 있습니다.


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

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

Runtime.getRuntime().getFreeMemory();

그런 다음 여유 메모리가 일정량 이하로 떨어지면 항목을 드롭 할 수 있습니다. 또는 캐시의 최대 크기를 구현하고이를 사용하여 항목을 사용하고 있습니다.

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

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

참고 URL : https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java

반응형