Gibt es eine SoftHashMap in Java?
Ich weiß, es ist eine WeakHashMap in java.util, aber da es WeakReferences benutzt für alles, das ist nur verwiesen wird, die von dieser Karte, die referenzierten Objekte verloren, auf der nächsten GC-Zyklus. So ist es fast nutzlos, wenn Sie wollen, um cache-random-Daten, die sehr wahrscheinlich erneut angefordert werden, ohne dass Hard-linked, den rest der Zeit. Die beste Lösung wäre eine Karte, die verwendet SoftReferences anstelle, aber ich habe keins gefunden in der Java-RT-Paket.
InformationsquelleAutor der Frage tigger | 2008-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bearbeiten (Aug. 2012):
Es stellt sich heraus, dass derzeit die beste Lösung sind wohl Guave 13.0 s
Cache
Klassen, erklärte auf Guave ' s Wiki - das ist, was ich nutzen werde.Es unterstützt sogar den Aufbau einer
SoftHashMap
(sieheCacheBuilder.newBuilder().softKeys()
), aber es ist wahrscheinlich nicht das, was Sie wollen, als Java-Experte Jeremy Manson erklärt (weiter unten finden Sie den link).Nicht, dass Ich kenne (Nov. 2008), aber irgendwie finden einige Umsetzung von
SoftHashMap
im Netz.Wie diese:
SoftHashMap
oder diese eine.Bearbeiten (Nov. 2009)
Als Matthias erwähnt in den Kommentaren, die Google Guava MapMaker nicht SoftReferences:
Wie bereits in dieser threadandere JSR166y Kandidat:
jsr166y.ConcurrentReferenceHashMap
Bearbeiten (August 2012)
Die Google-Implementierung verwendet ein hintergrund-thread nur, wenn zeitgesteuerter Ablauf der Einträge wird gebeten. Insbesondere verwendet er einfach
java.util.Timer
die ist nicht so aufdringlich wie mit einem separaten hintergrund-thread.Jeremy Manson empfiehlt, für jede cache, mit dieser Funktion zu vermeiden, die Gefahren von SoftReference:
http://jeremymanson.blogspot.de/2009/07/how-hotspot-decides-to-clear_07.html
Gibt es eine weitere Umsetzung von Apache Commonsnämlich org.apache.Unterhaus.Sammlungen.Karte.ReferenceMap; es unterstützt keine zeitgesteuerten entfernen, aber es unterstützt die Wahl, ob die Tasten sollten verglichen werden, indem die Identität oder Gleichheit. Außerdem ist diese Implementierung ist nicht concurrent - es kann gemacht werden synchronisiert, aber das funktioniert weniger gut, unter Zugriffe von mehreren threads.
InformationsquelleAutor der Antwort
Ich bin vertraut mit zwei Bibliotheken, die bieten eine SoftHashMap Umsetzung:
Apache Commons: org.apache.Unterhaus.Sammlungen.Karte.ReferenceMap
Google Collections: com.google.common.sammeln.ReferenceMap
InformationsquelleAutor der Antwort
Es ist ein Beispiel für die Implementierung in 98-Ausgabe des java-Spezialisten-newsletter
InformationsquelleAutor der Antwort jb.
Apache Shiro kommt mit einem SoftHashMap konzipiert für die Zwischenspeicherung. Seine auf der Grundlage der Artikel geschrieben von jb oben und lizenziert unter der Apache v2. Die Dokumentation finden Sie hier und der source-code hier.
InformationsquelleAutor der Antwort DallinDyer
Haben Sie sich überlegt mit einem LRUMap statt einer weichen HashMap? Sie bekommen mehr Kontrolle darüber, was gespeichert wird (oder zumindest, wie viel).
InformationsquelleAutor der Antwort Joel
Wenn Sie möchten, implementieren Sie eine cache-softreferences sind definitiv eine bessere Idee als die schwache Hinweise, aber es stellt Ihre gesamte cache-Abbau-Politik in den Händen der garbage collector. das ist wahrscheinlich nicht das, was Sie wollen.
Wenn auf Entfernung aus dem cache policy ist wichtig, Ihr gehen zu müssen, um es auf eigene Faust tun wahrscheinlich regelmäßige Verweise. Allerdings sind Sie gehen zu müssen, um zu entscheiden, wenn das Auswerfen von Gegenständen und das Auswerfen. Wenn Sie nur wollen, um die Dinge verlieren, wenn Sie laufen aus dem heap-Speicher Sie können Abfragen, verfügbare heap-space über:
Dann, wenn der freie Speicher sinkt unter einen bestimmten Betrag, den Sie beginnen können entweder Drop-Elemente. Oder Sie könnten einfach implementieren Sie eine maximale Größe für den cache, und verwenden, zu entscheiden, Wann Sie Dinge fallen lassen.
hier ist ein LRU-cache ich entwickelt, mit O(1) einfügen, löschen und lookup-Zeit, hat eine konfigurierbare maximale Anzahl von Elementen. Wenn Sie möchten, einen cache-das ist eine bessere Lösung imho als eine SoftHashMap.
Die softreferences sind ein guter Weg, um erstellen Sie eine anbauen-cache. Also die ideale Lösung wäre die Verwendung einer SoftHashMap zusammen mit einem regelmäßigen festen Größe cache. alle Einsätze in den cache gehen, in dem festen cache und die weichen hash map dann zur Referenz etwas nur sehen, wenn Ihr in den weichen hashmap (und update der Referenz-Zeit in den cache). auf diese Weise werden alle Ihre wichtigsten Elemente (entsprechend Ihrer gewählten Politik LRU, name,...) werden nie entfernt, weil Sie schwer sind, wird in der cache, aber Sie werden auch halten Sie auf, um weitere Dinge (ohne Politik), solange es ausreichend Arbeitsspeicher.
InformationsquelleAutor der Antwort luke