Java: Unterschied zwischen starker / weicher / schwacher / Phantomreferenz
Habe ich gelesen, dieser Artikel über das Thema, aber ich weiß nicht wirklich verstehen.
Bitte geben Sie mir einige Ratschläge, zusammen mit Beispielen, bei der Beschreibung der Konzepte.
InformationsquelleAutor der Frage | 2012-03-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java bietet zwei verschiedene Arten/Klassen von Referenz-Objekte: starke und schwach. Schwache Referenz-Objekte können weiter unterteilt werden in soft und phantom. Gehen wir mal Punkt für Punkt.
Starke Referenz Objekt
Dies ist der Standard-Typ/die Klasse der Referenz-Objekt, wenn nicht anders angegeben:
builder
ist eine starke Referenz-Objekt. Diese Art der Referenz macht das referenzierte Objekt nicht berechtigt, für die GC. Das heißt, wenn ein Objekt verwiesen wird, die von einem Kette von starken Referenz-Objektees kann nicht sein Müll gesammelt.Schwache Referenz-Objekt
Schwache Referenz-Objekte sind nicht die default-Typ/die Klasse der Referenz-Objekt und verwendet werden Sie sollte explizit angegeben werden, wie im obigen Beispiel. Diese Art der Referenz macht das Referenz-Objekt kommen für GC. Das ist in dem Fall nur die Referenz, erreichbar für die
StringBuilder
Objekt im Speicher ist tatsächlich der schwache Verweis, dann die GC ist erlaubt, Müll sammeln, dieStringBuilder
Objekt. Wenn ein Objekt im Speicher ist erreichbar nur durch Schwache Objekte referenziert, wird es automatisch die Berechtigung für die GC.Ebenen der Schwäche
Zwei verschiedene Ebenen der Schwäche können eingetragen werden: soft und phantom.
Einen soft Referenz-Objekt ist im Grunde eine schwache Referenz-Objekt, das im Speicher bleibt, ein bisschen mehr: in der Regel sind es widersteht GC-Zyklus bis der Speicher ist verfügbar und es besteht keine Gefahr von
OutOfMemoryError
(in diesem Fall, kann es entfernt werden).Auf der anderen Seite, ein phantom Referenz-Objekt ist nur sinnvoll zu wissen, Wann genau ein Objekt wurde effektiv aus dem Speicher entfernt: normalerweise werden Sie verwendet, um zu beheben komisch finalize() Wiederbelebung/Auferstehung Verhaltenda Sie wirklich zurück, nicht das Objekt selbst, sondern nur helfen,in Verfolgung Ihrer Speicher-Präsenz.
Schwache Referenz-Objekte sind ideal umzusetzen-cache-Modulen. In der Tat eine Art automatische Räumung kann implementiert werden, indem der GC Aufräumen Speicherbereiche, wenn Objekte/Werte sind nicht mehr erreichbar, die durch starke Referenzen-Kette. Ein Beispiel ist die WeakHashMap Beibehaltung der schwachen Schlüssel.
InformationsquelleAutor der Antwort Paolo Maresca
Schwache Referenz :
Einen schwachen Verweis, einfach ausgedrückt, ist eine Referenz, die ist nicht stark genug, um die Kraft, die ein Objekt im Speicher verbleiben. Schwache Referenzen erlauben Ihnen die Nutzung der garbage-collector ' s Fähigkeit, um zu bestimmen, Erreichbarkeit für Sie, so dass Sie nicht haben, es selbst zu tun.
Soft-Referenz :
Einem weichen Bezug ist genau wie eine schwache Referenz, außer, dass es weniger darauf erpicht zu werfen, entfernt das Objekt, auf das es sich bezieht. Ein Objekt, das nur schwach erreichbar (die stärksten Referenzen sind WeakReferences) werden verworfen, bei der nächsten garbage collection Zyklus, aber ein Objekt, das leise erreichbar wird, in der Regel bleiben, um für eine Weile.
Phantom Referenz :
Einem phantom Referenz ist ganz anders als entweder oder SoftReference WeakReference. Seinen Griff auf Ihr Objekt ist so Dünn, dass Sie auch nicht das Objekt abrufen-seine get () - Methode immer null zurück. Der einzige Einsatz solcher Verweis verfolgen, wenn es wird eingereiht in eine ReferenceQueue, als an diesem Punkt wissen Sie das Objekt, auf das es spitz ist tot.
Dieser text wurde entnommen von: https://weblogs.java.net/blog/2006/05/04/understanding-weak-referencesInformationsquelleAutor der Antwort Punith Raj
Den einfachen Unterschied zwischen
SoftReference
undWeakReference
wird durch Android-Entwickler.Den Unterschied zwischen einem
SoftReference
und einWeakReference
ist der Zeitpunkt, an dem die Entscheidung getroffen wird, um klare und enqueue-Referenz:Einen
SoftReference
geräumt werden sollte und in die Warteschlange eingereiht so spät wie möglich,das heißt, im Fall der VM ist in Gefahr läuft out of memory.
Einen
WeakReference
kann deaktiviert werden und in die Warteschlange eingereiht, sobald bekannt istschwach referenziert.
InformationsquelleAutor der Antwort Muhammad Nabeel Arif
Drei Begriffe, die Sie verwendet haben, sind überwiegend mit Objekt-EIGNUNG zu bekommen Müll gesammelt .
Schwache Referenz :: es ist ein Verweis, der nicht stark genug, um die Kraft, die das Objekt im Speicher verbleiben . Seine garbage-collector ' s Launen zu sammeln, die das Objekt für die garbage collection.
Sie können nicht erzwingen, dass GC nicht, es zu sammeln .
Weich Referenz :: Seine mehr oder weniger dasselbe wie die schwache Referenz . Aber man kann sagen, es hält das Objekt ein bisschen stärker als der schwache Verweis von der garbage-collection.
Wenn der Garbage-Kollektoren sammeln die schwache Referenz in den ersten Lebens-Zyklus selbst, es sammelt die weiche Referenz für den nächsten Zyklus der Garbage collection.
Starken Bezug :: Seine direkt gegenüber der beiden oben genannten Art von Informationsquellen .
Sie sind weniger wie man Müll gesammelt (Meistens sind Sie nie gesammelt.)
Finden Sie auf den folgenden link für mehr info :
http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/ref/Reference.html
InformationsquelleAutor der Antwort Sabya
4 Grad der Referenz -
Strong, Weak, Soft, Phantom
verwendet:
Schwache Verweise sind ideal zum implementieren der cache-Modulen.
InformationsquelleAutor der Antwort Preetham R U
Starke Referenzen
Diese sind Ihre regelmäßige Objekt-Referenzen, die wir code täglich:
Die variable "emp" hat auch eine starke Referenz auf ein Employee-Objekt und Objekte, die erreichbar sind durch eine beliebige Kette von starken Referenzen sind nicht für die garbage collection freigegeben.
In der Regel ist dies, was Sie wollen, aber nicht immer. Nun nehmen wir an, wir Holen viele Mitarbeiter aus der Datenbank in eine Sammlung oder eine Karte, und wir müssen eine Menge tun, um die Verarbeitung auf Sie Sie regelmäßig, um die Leistung halten, die wir halten Sie in den cache.
Soweit gut, aber jetzt brauchen wir verschiedene Daten, und wir brauchen nicht diejenigen, die Employee-Objekten, und diese sind nicht auf die dort verwiesen wird überall, außer für den cache. Das verursacht ein memory leak, da diese Objekte nicht im Einsatz, aber noch nicht die Voraussetzungen für die garbage collection, und wir können nicht entfernen Sie diese Objekte aus dem cache, weil wir keinen Bezug zu Ihnen?
Also auch hier müssen wir leeren Sie den gesamten cache manuell, das ist langweilig oder wir könnten andere Art von Referenzen z.B. Schwache Referenzen.
Schwache Referenzen
Ein schwacher Verweis hingegen nicht pin ein Objekt in den Speicher und GC würde in den nächsten GC-Zyklus, wenn nicht referenziert von anderen Referenzen. Wir können WeakReference-Klasse, die von Java zu erstellen, die oben genannten caches, die nicht speichern, Objekte, die nicht referenziert sind von woanders.
Daten zuzugreifen, die Sie benötigen, um call-cache.get(). Diesem Ruf zu bekommen, möglicherweise null zurückgeben, wenn die schwachen Referenz wurde Müll gesammelt: Sie müssen überprüfen Sie den Rückgabewert zu vermeiden, NPEs.
Java bietet Kollektionen, dass die Verwendung schwacher Referenzen z.B., die WeakHashMap Klasse speichert Schlüssel (nicht Werte) als schwache Referenzen. Wenn der key von GC würde dann der Wert wird automatisch aus der map entfernt, zu.
Da schwache Referenzen sind Objekte, die wir auch brauchen einen Weg, um Sie sauber zu machen (Sie sind nicht länger nützlich, wenn das Objekt Sie sich beziehen, wurde GC würde). Wenn Sie eine ReferenceQueue in den Konstruktor für eine schwache Referenz dann der garbage collector angefügt werden, dass die schwachen Verweis auf die ReferenceQueue, bevor Sie Finalisiert oder GC würde. Sie können diese Warteschlange in regelmäßigen Abständen Prozess und Umgang mit Toten verweisen.
Soft-Referenzen
Einer SoftReference ist wie eine WeakReference aber es ist weniger wahrscheinlich, um eine garbage Collection ausgeführt werden. Soft-Referenzen gelöscht werden, die im Ermessen des garbage Collectors in Reaktion auf die Speicher-Nachfrage. Die virtuelle Maschine wird garantiert, dass alle weichen Verweise zu leise erreichbaren Objekte gelöscht wurden, bevor es jemals werfen Sie einen OutOfMemoryError.
Phantom-Referenzen
Phantom-Referenzen sind die schwächsten von allen Referenz-Typen, ruft auf Ihnen wird immer null zurückgegeben. Ein Objekt ist phantomly verwiesen, nachdem es abgeschlossen wurde, aber vor seinem zugewiesenen Speicher zurückgefordert wurde, im Gegensatz zu schwache Referenzen, die in die Warteschlange eingereiht, bevor Sie Finalisiert oder GC würde Phantom-Referenzen werden nur selten verwendet.
So, wie Sie sind nützlich? Wenn Sie bauen eine phantom-Bezug müssen Sie immer eine ReferenceQueue. Dies bedeutet, dass Sie verwenden können, ein phantom als Referenz, um zu sehen, wenn Ihr Objekt ist GC würde.
Hey, also, wenn schwache Referenzen werden in die Warteschlange eingereiht, wenn Sie als finalize, aber noch nicht GC würde, konnten wir erstellen eine neue starke Referenz auf das Objekt in der finalizer block und verhindern, dass das Objekt, GC würde. Ja, man kann, aber man sollte das wohl nicht tun. Um zu überprüfen, für diesen Fall die GC-Zyklus passieren wird mindestens zweimal für jedes Objekt, es sei denn, das Objekt ist erreichbar nur durch ein phantom-Referenz. Dies ist der Grund, warum Sie können aus dem Haufen, auch wenn Ihr Speicher enthält jede Menge Müll. Phantom-Referenzen können dies verhindern.
InformationsquelleAutor der Antwort Naresh Joshi