wake-up-neo.com

Was ist eine WeakHashMap und wann wird sie verwendet?

Was ist eine WeakHashMap und wann sollte sie verwendet werden? Was ist der Unterschied zwischen WeakHashMap und HashMap?

136
developer

Elemente in einer schwachen Hashmap können vom Garbage Collector zurückgefordert werden, wenn keine anderen starken Verweise auf das Schlüsselobjekt vorhanden sind. Dies macht sie für die Zwischenspeicherung von Caches/Nachschlägen nützlich.

Schwache Verweise sind nicht auf diese Hashtabellen beschränkt. Sie können WeakReference für einzelne Objekte verwenden. Sie sind nützlich, um Ressourcen zu sparen. Sie können einen Verweis auf etwas beibehalten, es jedoch sammeln, wenn nichts anderes darauf verweist. (Übrigens, eine starke Referenz ist eine normale Java-Referenz). Es gibt auch schwache Referenzen, die nicht so leicht gesammelt werden können wie weiche Referenzen (die sich nicht lange hinhalten, nachdem die letzten starken Referenzen verschwunden sind).

77
vickirk

Wie andere bereits erwähnt haben, bietet ein schwacher Verweis die Möglichkeit, ein Objekt als Schlüssel zu verwenden, ohne einen starken Verweis darauf zu erstellen. Dies ist in Situationen nützlich, in denen Sie nicht die Fähigkeit der JVM beeinträchtigen möchten, das Objekt zu sammeln, aber dennoch die Möglichkeit haben, einen bestimmten Aspekt des Objekts zu verfolgen, wodurch eine schwache Referenz ideal für das Zwischenspeichern oder Speichern von Metadaten des Objekts ist .

Ich würde empfehlen, "Verstehe schwache Referenzen" (Oracle-Blogartikel) über strong vs. schwache Referenzen in Java. Ohne das Verständnis des Unterschieds macht die Datenstruktur selbst wenig Sinn. 

43
mmccomb

kasse Effective Java, Edition 2, Seite 26.

Eine weitere häufige Quelle für Speicherverluste sind Caches. Sobald Sie ein .__ setzen. Objektreferenz in einen Cache, es ist leicht zu vergessen, dass es dort ist, und lässt es in der Cache lange nachdem es irrelevant wird. Es gibt mehrere Lösungen für dieses Problem . Wenn Sie das Glück haben, einen Cache zu implementieren, für den ein Eintrag genau relevant ist solange es Verweise auf seinen Schlüssel außerhalb des Cache gibt, repräsentieren Sie den Cache als WeakHashMap ; Einträge werden automatisch entfernt, wenn sie veraltet sind . Denken Sie daran, dass WeakHashMap nur nützlich ist, wenn die gewünschte Lebensdauer des Caches Einträge werden durch externe Verweise auf den Schlüssel bestimmt, nicht durch den Wert.

18
Hao Deng

Von jGuru :

Eine WeakHashMap ist eine spezielle Map Implementierung, wo die Schlüssel der map sind in einer .__ gespeichert. Java.lang.ref.WeakReference. Durch Speichern der Schlüssel in einer schwachen Referenz, Schlüssel-Wert-Paare können dynamisch .__ sein. fiel von der Karte, wenn das einzige Verweis auf den Schlüssel stammt aus dem schwachen Referenz. Das macht die WeakHashMap eine ausgezeichnete Implementierung für eine schwach referenzierte Liste mit Einträgen die nicht woanders verwendet werden, kann .__ sein. fiel ohne Nebenwirkungen. Ebenfalls, Nur weil ein Schlüssel fallen gelassen werden kann bedeutet nicht, dass es sofort .__ sein wird. fallen gelassen. Wenn das System über ausreichend .__ verfügt. Ressourcen, der schwache Schlüsselreferenz, dass kann nicht extern referenziert werden lange Zeit herum.

Mehr zu Referenzen :

11
Buhake Sindi

Schwache Referenzen beziehen sich auf Erreichbarkeit und lassen den Garbage Collector (GC) die Arbeit für Sie erledigen ... Ich denke, es ist am besten, die Probleme zu verstehen, die die schwache Referenz versucht zu lösen und zu sehen in Aktion:

  • Ein IBM Artikel about:

    Java-Theorie und -Praxis: Einstecken von Speicherverlusten mit schwachen Referenzen . Speicherverluste bei globalen Karten, Identifizieren von Speicherverlusten, schwache Hinweise auf die Rettung, ...

  • Ein Blogartikel wann man WeakHashMap verwendet:

    ... Wenn die WeakHashMap nicht zum Zwischenspeichern geeignet ist, wozu ist sie dann geeignet? Es ist gut, kanonische Karten zu implementieren. Nehmen wir an, Sie möchten einige zusätzliche Informationen zu einem Objekt, für das Sie eine starke Referenz haben zu. Sie fügen einen Eintrag in eine WeakHashMap mit dem Objekt als Schlüssel und die zusätzlichen Informationen als Kartenwert. Dann, solange Sie eine .__ behalten. starke Referenz auf das Objekt, Sie können die Karte auf .__ überprüfen. Extrahieren Sie die zusätzlichen Informationen. Und sobald Sie das Objekt freigeben, wird die Der Karteneintrag wird gelöscht und der Speicher wird für die zusätzlichen Informationen verwendet. wird veröffentlicht. ...

  • Die Java Dokumentation zu Java.lang.ref

7

leute verwenden es, um "Cache-Speicher" zu implementieren. Wenn Sie über einige Objekte verfügen, die häufig wiederverwendet werden Oftmals in Ihrer Anwendung, und derenKonstruktion teuer ist, gibt es zu viele davon, um sie zu behalten Sie alleim Speicher -- verwenden Sie WeakHashMap.

Fügen Sie dort das Objekt ein, das aktuell nicht verwendet wird Wenn dieses Objekt benötigt wird, holen Sie es aus der Karte heraus. Meistens bleiben die meisten dieser Objekte in der Map. Der Trick ist, dass sie nicht direkt gehalten werden, sondern durch WeakReferences. Wenn es also wirklich "überfüllt" wird Wenn wir aus dem Speicher laufen, darf gc sie abholen. Wenn Sie also versuchen, das Objekt aus der WeakHashMap zu entfernen, müssen Sie es sicherstellen .ist immer noch hier. Andernfalls müssen Sie es erneut erstellen.

4
Chetan Sharma

Sie können eine WeakHashmap verwenden, um die Wahrscheinlichkeit eines Speicherverlusts durch das Zwischenspeichern eines Objekts zu verringern. Die WeakHashMap entfernt automatisch Einträge, wenn alle Verweise auf den Schlüssel entfernt werden.

2
Gary Rowe

Weakhashmap erlaubt es, seine Einträge zu sammeln und nicht darauf zu warten, dass die vollständige Hashmap nicht verwendet wird. Daher werden einzelne Werte automatisch entfernt, wenn der Schlüssel nicht mehr normal verwendet wird. 

Es kann verwendet werden, um einen Speicherverlust zu verhindern, bei dem die Hashmap nie zurückgefordert wurde, da ein oder mehrere Schlüssel noch verwendet werden, selbst wenn dies nicht der Fall ist (z. B. Benutzerdaten usw.).

0
krmanish007