Wann würden Sie eine WeakHashMap oder eine WeakReference?
Die Verwendung von schwachen Referenzen ist etwas, das ich habe nie gesehen, eine Umsetzung, so versuche ich, herauszufinden, was der Fall für Sie ist und wie die Umsetzung funktionieren würde. Wann haben Sie benötigt WeakHashMap
oder WeakReference
und wie wurde es verwendet?
InformationsquelleAutor der Frage 18Rabbit | 2008-09-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verständnis Schwache VerweiseEthan Nicholas
InformationsquelleAutor der Antwort Jacob Krall
Einer Unterscheidung klar ist der Unterschied zwischen einem
WeakReference
und einSoftReference
.Grundsätzlich eine
WeakReference
werden GC-d durch die JVM eifrig, sobald das referenzierte Objekt keine schwer Verweise auf Sie. EinSoftReference
d-Objekt auf der anderen Seite, wird dazu neigen, zu verlassen werden durch den garbage collector, bis es wirklich braucht, um wieder den Speicher.Einen cache, wo die Werte innerhalb
WeakReference
s wäre ziemlich nutzlos (in einerWeakHashMap
ist es die Tasten, die sind schwach, auf die verwiesen wird).SoftReferences
nützlich sind, umschließen die Werte um, wenn Sie möchten, implementieren Sie einen cache, der kann wachsen und schrumpfen mit dem verfügbaren ArbeitsspeicherInformationsquelleAutor der Antwort oxbow_lakes
Einem Gemeinsamen Nutzung von
WeakReference
s undWeakHashMap
s ist insbesondere für das hinzufügen von Eigenschaften zu Objekten. Gelegentlich werden Sie wollen, fügen Sie einige Funktionen oder Daten an ein Objekt, sondern Unterklassen und/oder Zusammensetzung nicht eine option, in diesem Fall die offensichtliche Sache zu tun, wäre eine hashmap verknüpfen Sie das Objekt aus, das Sie erweitern möchten, um die Eigenschaft, die Sie hinzufügen möchten. dann wenn Sie benötigen, die Immobilie, die Sie können nur suchen Sie es in der Karte. Allerdings, wenn die Objekte, die Sie sind hinzufügen von Eigenschaften, die dazu neigen, zu bekommen zerstört und erstellt eine Menge, können Sie am Ende mit einer Menge von alten Objekten für Eure map die Einnahme von viel Speicher.Wenn Sie eine
WeakHashMap
statt die Objekte, lassen Sie Ihre Karte, sobald Sie nicht mehr benötigt werden, der rest des Programms, welches das gewünschte Verhalten.Ich hatte, dies zu tun, fügen Sie einige Daten zu
java.awt.Component
zu bekommen, um eine änderung in der JRE zwischen 1.4.2 und 1.5, hätte ich es behoben, indem bilden von Unterklassen jede Komponente, die ich war daran interessiert, int (JButton
JFrame
JPanel
....) aber das war viel einfacher, mit viel weniger code.InformationsquelleAutor der Antwort luke
Anderen nützlichen Fall für
WeakHashMap
undWeakReference
ist ein - listener-registry Umsetzung.Wenn man etwas erschaffen will, die hören auf bestimmte Ereignisse, in der Regel registrieren Sie einen listener, z.B.
Wenn die
manager
speichert Ihre Zuhörer mit einemWeakReference
das heißt, Sie brauchen nicht zu entfernen, die registrieren, z.B. mit einermanager.removeListener(myListenerImpl)
da ist, wird es automatisch entfernt, wenn Sie Ihre Zuhörer oder Ihre Komponente hält den Hörer nicht mehr verfügbar.Du natürlich noch manuell entfernen können Sie Ihre Zuhörer, aberwenn Sie nicht oder vergessen Sie es, es wird nicht zu einem memory leak, und es wird nicht verhindern, dass Ihr Zuhörer wird Müll gesammelt.
Wo kommt
WeakHashMap
kommen ins Bild?Den listener-Registrierung, die Wünsche zum speichern von registrierten Listener als
WeakReference
s braucht, eine Sammlung zu speichern Sie diese Verweise. Es gibt keineWeakHashSet
Implementierung in die standard-Java-Bibliothek nur eineWeakHashMap
aber wir können verwenden die letztere zu "implementieren", die die Funktionalität des erste:Mit diesem
listenerSet
registrieren Sie einen neuen listener, den Sie gerade haben, um es in den Satz, und auch wenn es nicht explizit entfernt, wenn der Hörer nicht mehr referenziert wird, wird es automatisch entfernt werden, indem die JVM.InformationsquelleAutor der Antwort icza
Wenn Sie zum Beispiel möchten, um zu verfolgen alle erstellten Objekte einer bestimmten Klasse. Um immer noch erlauben, diese Objekte der garbage Collection freigegeben wird, halten Sie eine Liste/Karte von schwachen Referenzen auf die Objekte statt der Objekte selbst.
Nun, wenn jemand erklären könnte, phantom-Referenzen zu mir, ich würde mich freuen...
InformationsquelleAutor der Antwort JesperE
Einen Einsatz in der Praxis hatte ich für WeakReferences ist, wenn Sie ein einzelnes, sehr großes Objekt, das selten verwendet wird. Sie wollen nicht zu halten Sie in Erinnerung, wenn es nicht benötigt wird; aber wenn ein anderer thread muss das gleiche Objekt, Sie wollen nicht zwei von Ihnen in Erinnerung. Sie können eine schwache Referenz auf das Objekt, irgendwo, und harte Verweise in den Methoden, die Sie verwenden; wenn die Methoden, die beide fertig sind, wird das Objekt gesammelt werden.
InformationsquelleAutor der Antwort
Diesem blog-Eintrag demonstriert die Verwendung der beiden Klassen: Java: Synchronisation auf eine ID. Die Nutzung geht so etwas wie dieses:
IdMutextProvider bietet id-basierte Objekte zu synchronisieren. Die Anforderungen sind:
Dies wird erreicht, indem ein interner Speicher Karte Typ:
Das Objekt ist sowohl der Schlüssel als auch Wert. Wenn keine externe Karte hat eine harte Referenz auf das Objekt, es kann sein Müll gesammelt. Werte, die in der Karte gespeichert sind, mit harten Verweise, so muß der Wert, eingewickelt in ein WeakReference um zu verhindern, dass ein Speicher-Leck. Dieser Letzte Punkt ist in der javadoc.
InformationsquelleAutor der Antwort McDowell
Wie oben erwähnt, eine schwache Referenz gehalten werden, solange ein starker Bezug vorhanden ist.
Beispiel wäre die Nutzung von WeakReference im inneren Zuhörer, so dass die Zuhörer sind nicht mehr aktiv, wenn die Referenz zu Ihrem Ziel-Objekt Weg ist.
Beachten Sie, dass dies nicht bedeutet, die WeakReference ist entfernt von der Listener-Liste, die Reinigung ist immer noch erforderlich, kann aber durchgeführt werden, zum Beispiel, zu festgelegten Zeiten.
Dies hat auch den Effekt verhindert, dass das Objekt angehört, um aus dem halten starke Referenzen und schließlich eine Quelle der Speicher aufblasen.
Beispiel: Swing-GUI-Komponenten verwenden, die ein Modell mit einem längeren Lebenszyklus als die Fenster.
Beim spielen mit den Zuhörern, wie oben beschrieben, haben wir schnell gemerkt, dass Objekte gesammelt "sofort" aus der Sicht des Anwenders.
InformationsquelleAutor der Antwort Louis Jacomet
Ich habe eine google-code-Suche für die "new WeakHashMap()".
Habe ich ein paar Spiele aus dem GNU-classpath-Projekts und
InformationsquelleAutor der Antwort anjanb
können Sie weakhashmap zu implementieren, die eine Ressource-free-caching für expansive Objekt erstellen.
aber beachten Sie, dass es ist nicht wünschenswert, um mutable-Objekte.
ich benutzte es, um die cache Abfrage-Ergebnis (etwa 400 ms, execute), um eine text-Suchmaschine, die nur selten aktualisiert.
InformationsquelleAutor der Antwort Andreas Petersson