Czy jest SoftHashMap w Javie?

Wiem, że jest WeakHashMap w Javie.util, ale ponieważ używa WeakReferences do wszystkiego, do czego odwołuje się tylko ta mapa, odwołane obiekty zostaną utracone w następnym cyklu GC. Jest to więc prawie bezużyteczne, jeśli chcesz buforować losowe DANE, które są bardzo prawdopodobne, że zostaną ponownie poproszone bez twardego połączenia przez resztę czasu. Najlepszym rozwiązaniem byłaby mapa, która zamiast tego używa Softreferencji, ale nie znalazłem jej w pakiecie Java RT.

Author: Stu Thompson, 2008-11-05

6 answers

Edit (Aug. 2012):

Okazuje się, że obecnie najlepszym rozwiązaniem są prawdopodobnie klasy Guava 13.0 Cache, wyjaśnione na Guava ' s Wiki - to właśnie zamierzam użyć. Obsługuje nawet budowanie SoftHashMap (Zobacz CacheBuilder.newBuilder().softKeys()), ale prawdopodobnie nie jest to to, czego chcesz, jak wyjaśnia ekspert Javy Jeremy Manson(poniżej znajdziesz link).


Not that I know of (Nov. 2008), ale można znaleźć jakąś implementację SoftHashMap w sieci.

Jak ten: SoftHashMap lub ten .


Edit (Nov. 2009)
Jak wspomina Matthias w komentarzach, Google Guava MapMaker używa Softreferencji:

A ConcurrentMap konstruktor, zapewniający dowolną kombinację tych funkcji:

  • miękkie lub słabe klawisze,
  • miękkie lub słabe wartości,
  • czas ważności i
  • obliczanie wartości na żądanie.

Jako wspomniany w ten wątek , kolejny kandydat JSR166y:

Jsr166y. ConcurrentReferenceHashMap

W przeciwieństwie do Google, Google nie jest w stanie udostępnić swojej strony internetowej.]}

Edycja (Sierpień 2012)

Implementacja Google używa wątku w tle tylko wtedy, gdy wymagane jest czasowe wygaśnięcie wpisów. W szczególności po prostu używa java.util.Timer, co nie jest tak natrętne jak posiadanie osobnego wątku tła.

Jeremy Manson zaleca, dla każdej pamięci podręcznej, użycie tej funkcji, aby uniknąć niebezpieczeństw związanych z SoftReference: http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html

Jest jeszcze jedna implementacja z Apache Commons , a mianowicie org.Apacz.commons.Kolekcje.Mapa.ReferenceMap ; nie obsługuje usuwania czasowego, ale obsługuje wybór, czy klucze mają być porównywane przez tożsamości lub przez równość. Co więcej, Ta implementacja nie jest współbieżna - może być zsynchronizowana, ale to działa mniej dobrze pod dostępami z wielu wątków.

 25
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:37

Znam dwie biblioteki, które oferują implementację SoftHashMap:

  1. Apache Commons : org.Apacz.commons.Kolekcje.Mapa.ReferenceMap

  2. Google Collections : com.google.pospolite.zbieraj.ReferenceMap

 20
Author: Gili,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 03:56:02

Przykładowa implementacja znajduje się w 98 numerze java specialists newsletter

 3
Author: jb.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-05 08:45:21

Apache Shiro jest wyposażony w SoftHashMap przeznaczony do buforowania. Jest oparty na artykule zamieszczonym przez JB powyżej i licencjonowany pod Apache v2. Dokumentację można znaleźć tutaj, A kod źródłowy tutaj.

 2
Author: DallinDyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-05 15:27:15

Czy rozważałeś użycie LRUMap zamiast miękkiej Hashmapy? Masz większą kontrolę nad tym, co jest przechowywane(a przynajmniej ile).

 2
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-21 12:54:37

Jeśli chcesz zaimplementować cache softreferencje są zdecydowanie lepszym pomysłem niż słabe referencje, ale to stawia całą Politykę usuwania cache w rękach garbage collector. co prawdopodobnie nie jest tym, czego chcesz.

Jeśli polityka usuwania pamięci podręcznej jest ważna, będziesz musiał to zrobić samodzielnie, najprawdopodobniej używając regularnych referencji. Jednak będziesz musiał zdecydować, kiedy wysuwać elementy i które wysuwać. Jeśli chcesz stracić rzeczy tylko wtedy, gdy kończy ci się przestrzeń sterty można odpytywać dostępną przestrzeń sterty poprzez:

Runtime.getRuntime().getFreeMemory();

Wtedy, gdy wolna pamięć spadnie poniżej określonej ilości, możesz zacząć upuszczać przedmioty. Możesz też zaimplementować maksymalny rozmiar pamięci podręcznej i użyć go do decydowania, kiedy upuścić rzeczy.

Oto LRU cache zaprojektowałem z o(1) wstawianie, usuwanie i wyszukiwanie czasu, który ma konfigurowalną maksymalną liczbę elementów. Jeśli chcesz cache to będzie lepsze rozwiązanie imho niż SoftHashMap.

Softreferencje to świetny sposób na stworzenie rozwijalnej pamięci podręcznej. Więc idealnym rozwiązaniem byłoby użycie SoftHashMap wraz z regularnym buforem o stałym rozmiarze. mieć wszystkie wkładki do pamięci podręcznej iść zarówno do stałej pamięci podręcznej i miękkiej mapy hash następnie odwołać się coś tylko zobaczyć, czy jego w miękkiej hashmap (i zaktualizować czas odniesienia w pamięci podręcznej). w ten sposób wszystkie najważniejsze elementy (zgodnie z wybraną Polityką LRU, MFU,...) nigdy nie zostaną usunięte, ponieważ są trudne odniesienia w pamięci podręcznej, ale będziesz również trzymać się więcej rzeczy (bez kontroli zasad) tak długo, jak jest wystarczająca pamięć.

 1
Author: luke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:48