Einen schwache Referenzeinfach ausgedrückt, ist ein
Verweis, der nicht stark genug ist, um
Kraft, die ein Objekt im Speicher verbleiben.
Schwache Referenzen erlauben, Sie zu nutzen
der garbage-collector ' s Fähigkeit,
festzustellen, Erreichbarkeit für Sie, so dass Sie
nicht haben, es selbst zu tun. Sie
erstellen Sie eine schwache Referenz, wie diese:
dann
an anderer Stelle im code, die Sie verwenden können weakWidget.get() um die tatsächliche Widget Objekt. Natürlich ist das schwach
Referenz ist nicht stark genug, um
verhindern garbage collection, so können Sie
finden (wenn es keine starke
Verweise auf das widget) , weakWidget.get() plötzlich beginnt
Rückkehr null.
...
Soft-Referenzen
Einen weich Referenz ist genau wie ein
weak-Referenzen, außer, dass es weniger
eifrig wegwerfen, das Objekt zu
die es verweist. Ein Objekt, das
nur schwach erreichbar (die stärkste
Referenzen sind WeakReferences)
verworfen werden bei der nächsten garbage
Sammlung, - Zyklus, sondern ein Objekt, das
ist leise, wird in der Regel erreichbar
Stock herum für eine Weile.
SoftReferences nicht erforderlich zu
Verhalten sich nicht anders als WeakReferencesaber in der Praxis leise
erreichbare Objekte werden in der Regel
erhalten, solange der Speicher ist in
reichhaltiges Angebot. Dies macht Sie zu einem
hervorragende Grundlage für einen cache, so
wie die Bild-cache oben beschrieben,
da lassen Sie der Müll
Sammler sorgen um beide, wie
erreichbar sind die Objekte (ein stark
erreichbar Objekt nie entfernt werden
aus dem cache) und wie schlecht es braucht
die Erinnerung, die Sie verbrauchen.
Dem Sun JRE nicht Behandlung von SoftReferences anders aus WeakReferences. Wir versuchen zu halten, um das Objekt verwiesen wird, die von einer SoftReference, wenn es nicht Druck auf den verfügbaren Speicher. Ein detail: die Richtlinie für die "client" und "server" JRE unterscheiden: der client-JRE versucht, halten Sie Ihren Fußabdruck klein lieber klar SoftReferences, anstatt erweitern Sie den heap, in der Erwägung, dass die server-JRE versucht zu halten, Ihre Leistung hoch, lieber erweitern Sie den heap (wenn möglich), anstatt klar SoftReferences. Eine Größe passt nicht allen.
Schwache Referenzen werden eifrig gesammelt. Wenn GC findet, dass ein Objekt
weakly reachable (erreichbar nur durch schwache Referenzen), es werden klar die
schwache Referenzen auf dieses Objekt sofort. Als solche, Sie sind gut für
hält eine Referenz auf ein Objekt, für das Sie Ihr Programm auch hält
(stark auf die verwiesen wird) "zugehörige Informationen" somewere, wie Cache
reflection Informationen über eine Klasse, oder ein wrapper für ein Objekt, etc.
Alles, was keinen Sinn macht zu halten, nachdem das Objekt, das es verbunden ist
mit GC-ed. Wenn der schwache Referenz wird gelöscht, es wird eingereiht in eine
Referenz-Warteschlange, dass Ihre code-Umfragen irgendwo, und er verwirft die
zugehörige Objekte als gut. Das heißt, Sie halten zusätzliche Informationen über eine
Objekt, aber diese information ist nicht erforderlich, wenn ein Objekt es sich bezieht
geht Weg. Eigentlich, in bestimmten Situationen können Sie sogar Unterklasse
WeakReference und halten die damit verbundenen zusätzlichen Informationen über das Objekt
in den Bereichen der WeakReference Unterklasse. Eine weitere typische Verwendung von
WeakReference ist in Verbindung mit Karten für das halten kanonischen Instanzen.
SoftReferences auf der anderen Seite sind gut für die Zwischenspeicherung von externen, recreatable Ressourcen
als die GC in der Regel Verzögerungen ausgleichen. Es garantiert aber, dass alle
SoftReferences bekommen wird gelöscht, bevor OutOfMemoryError geworfen wird, so dass Sie
theoretisch kann nicht dazu führen, dass ein OOME[*].
Typische use-case-Beispiel ist das halten einer geparsten form eines Inhalts von einem
Datei. Würden Sie implementieren ein system, wo würden Sie eine Datei laden, analysieren Sie diese, und halten
eine SoftReference, um das root-Objekt des geparsten Darstellung. Das nächste mal
Sie müssen die Datei, die Sie werde versuchen, um es abzurufen durch die SoftReference. Wenn
Sie können es abrufen, man erspart sich einen anderen laden/Parsen, und wenn der GC
es geklärt in der Zwischenzeit, laden Sie es. Auf diese Weise, Sie nutzen kostenlos
Speicher für performance-Optimierung, aber nicht das Risiko ein OOME.
Nun für die [*]. Halten einer SoftReference kann nicht dazu führen, dass ein OOME in sich selbst. Wenn
auf der anderen hand, die Sie irrtümlich mit SoftReference für eine Aufgabe eine WeakReference gemeint ist
verwendet werden (das heißt, Sie halten Informationen, die einem Objekt zugeordnet irgendwie
stark referenziert wird, und verwerfen es, wenn die Referenz-Objekt bekommt
gelöscht), Sie kann in die OOME, wie Ihr code, der abfragt, der ReferenceQueue
und verwirft die zugehörigen Objekte passieren könnte, nicht rechtzeitig
Mode.
So, die Entscheidung ist abhängig von der Nutzung
- wenn Sie die Zwischenspeicherung von Informationen, die teuer in der Konstruktion, aber
dennoch reconstructible von anderen Daten, die Verwendung von soft-Referenzen
- wenn Sie halten eine Referenz auf eine kanonische Instanz der einige Daten, oder
möchten Sie eine Referenz auf ein Objekt ohne "Besitz" (so
verhindert GC würde), eine schwache Referenz.
In Java; Reihenfolge von der stärksten zur schwächsten, die es gibt: Stark, Soft -, Weak-und Phantom -
Einen Starken Bezug ist eine normale Referenz, die dem Schutz der genannten Objekt aus der Sammlung von GC. d.h. Niemals Müll sammelt.
Einen Weich Referenz ist berechtigt, die zur Abholung durch den garbage-collector, aber wahrscheinlich nicht gesammelt werden, bis sich Ihr Speicherplatz benötigt wird. also Müll sammelt, bevor OutOfMemoryError.
Einen Schwache Referenz ist eine Referenz, die nicht zu schützen, eine referenzierte Objekt aus der Sammlung von GC. also Müll sammelt, wenn keine Starken oder Weichen refs.
Einen Phantom Referenz ist eine Referenz auf ein Objekt ist phantomly verwiesen, nachdem es abgeschlossen wurde, aber vor seinem zugewiesenen Speicher zurückgefordert wurde.
Analogie: Übernehmen eine JVM ist ein Königreich, das Objekt ist ein König Reich, und der GC ist ein Angreifer des Königreichs, die versucht, den König töten(Objekt).
Als König ist StarkeGC kann ihn nicht töten.
Als König ist SoftGC greift ihn aber König regieren das Königreich mit Schutz, bis Ressourcen verfügbar sind.
Als König ist SchwachGC greift ihn aber Regel das Reich ohne Schutz.
Als König ist PhantomGC bereits getötet, ihn aber der König ist über seine Seele.
Prinzip:weak reference ist in Bezug auf garbage collection. Normalerweise, Objekt mit einem oder mehreren reference werden nicht für die garbage collection freigegeben.
Die oben genannten Grundsatz ist nicht anwendbar, wenn es weak reference. Wenn ein Objekt nur eine schwache Referenz mit anderen Objekten, dann ist alles bereit für die garbage collection.
Betrachten wir das folgende Beispiel: Wir haben eine Map mit Objekten, wo die Schlüssel verweisen auf ein Objekt.
import java.util.HashMap;publicclassTest{publicstaticvoid main(String args[]){HashMap<Employee,EmployeeVal> aMap =newHashMap<Employee,EmployeeVal>();Employee emp =newEmployee("Vinoth");EmployeeVal val =newEmployeeVal("Programmer");
aMap.put(emp, val);
emp =null;System.gc();System.out.println("Size of Map"+ aMap.size());}}
Nun, während der Ausführung das Programm, das wir gemacht haben emp = null. Die Map mit dem Schlüssel macht keinen Sinn hier, wie es ist null. In der oben genannten situation, das Objekt ist nicht Müll gesammelt.
WeakHashMap
WeakHashMap ist eine, wo die Einträge (key-to-value mappings) entfernt wird, wenn es nicht mehr möglich ist, rufen Sie von der Map.
Lassen Sie mich das Beispiel oben denselben mit WeakHashMap
import java.util.WeakHashMap;publicclassTest{publicstaticvoid main(String args[]){WeakHashMap<Employee,EmployeeVal> aMap =newWeakHashMap<Employee,EmployeeVal>();Employee emp =newEmployee("Vinoth");EmployeeVal val =newEmployeeVal("Programmer");
aMap.put(emp, val);
emp =null;System.gc();int count =0;while(0!= aMap.size()){++count;System.gc();}System.out.println("Took "+ count
+" calls to System.gc() to result in weakHashMap size of : "+ aMap.size());}}
Ausgabe: Nahm 20 calls to System.gc() zu führen aMap size: 0.
WeakHashMap hat nur schwache Referenzen auf die Tasten, nicht mit starken Referenzen wie andere Map Klassen. Gibt es Situationen, die Sie haben zu kümmern, wenn der Wert oder Schlüssel ist stark referenziert, obwohl Sie verwendet werden WeakHashMap. Dies können Sie vermeiden, indem Sie wickelt das Objekt in einen WeakReference.
Soft Reference ist etwas stärker, die schwachen Referenz. Soft-Referenz ermöglicht die garbage collection, bittet aber um den garbage collector, um es zu deaktivieren, nur wenn es keine andere Möglichkeit gibt.
Den garbage collector nicht aggressiv sammeln leise erreichbar Objekten, wie es funktioniert mit schwach erreichbar-stattdessen sammelt nur leise erreichbar-Objekte, wenn es wirklich "braucht" das Gedächtnis. Soft-Referenzen sind eine Art zu sagen, der garbage collector, "solange die Erinnerung ist nicht zu eng, ich möchte zu halten das Objekt herum. Aber wenn der Speicher wirklich eng ist, gehen Sie voran und sammeln Sie es, und ich werde damit umzugehen." Der garbage collector benötigt wird, um alle zu löschen soft-Verweise, bevor Sie es werfen kann OutOfMemoryError.
Der einzige wirkliche Unterschied zwischen einem soft-Referenz und eine schwache Referenz ist, dass der garbage collector uses algorithms to decide whether or not to reclaim a softly reachable object, but always reclaims a weakly reachable object.
SoftReference ist konzipiert für caches. Wenn festgestellt wird, dass ein WeakReference verweist auf einen sonst nicht erreichbaren Objekt, dann bekommt es sofort gelöscht. SoftReference gelassen werden können. In der Regel gibt es einige-Algorithmus in Bezug auf die Menge des freien Speichers und die Zeit, die Sie zuletzt verwendet, um zu bestimmen, ob es gelöscht werden soll. Die aktuelle Sonne-Algorithmus ist klar die Referenz, wenn es nicht verwendet wurde, in wie vielen Sekunden es sind Megabyte freien Arbeitsspeicher auf dem Java-heap (konfigurierbar, server HotSpot prüft, gegen die maximal mögliche heap-wie durch -Xmx). SoftReferences geklärt sein wird, bevor OutOfMemoryError geworfen wird, sofern nicht anders erreichbar.
Pro der doclose WeakReferences muss gelöscht werden durch einen Laufenden GC.
Pro der doclose SoftReferences muss geklärt sein, bevor OOM ausgelöst.
Das ist der einzige wirkliche Unterschied. Alles andere ist nicht Teil des Vertrages. (Ich nehme an die neuesten docs sind vertragliche.)
SoftReferences sind nützlich. Speicher-und Kleinschreibung caches verwenden SoftReferences, nicht WeakReferences.
Den nur richtige Verwendung von WeakReference zu beachten ist bei der GC laufen. Sie tun dies, indem eine neue WeakReference, deren Gegenstand unmittelbar den Bereich verlässt, dann versuchen Sie null aus weak_ref.get(). Wenn es null Sie lernen, dass zwischen dieser Dauer die GC lief.
Als für falsche Verwendung von WeakReference, die Liste ist endlos:
ein mieser hack zu implementieren Priorität-2 softreference, so dass Sie nicht haben, um eines zu schreiben, noch es funktioniert nicht wie erwartet, da der cache gelöscht werden, auf jeder GC laufen, auch wenn es spare-Speicher. Sehen https://stackoverflow.com/a/3243242/632951 für phails. (Außerdem, was ist, wenn man mehr als 2 Level cache Priorität? Sie würden immer noch gotta brauchen eine echte Bibliothek.)
ein mieser hack zu verknüpfen, Daten mit einem Objekt zu einer vorhandenen Klasse, noch es entsteht ein Speicherleck (OutOfMemoryError), wenn dein GC beschließt, eine Auszeit zu nehmen, nachdem Ihre weakreferences sind erstellt. Außerdem, es ist nicht hässlich: Ein besserer Ansatz ist die Verwendung von Tupeln.
ein mieser hack zu verknüpfen, Daten mit einem Objekt einer bestehenden Klasse, wobei die Klasse, die Nerven, um sich nicht subclassable, und wird in eine vorhandene Funktion codedie Sie aufrufen müssen. In einem solchen Fall die richtige Lösung ist entweder Bearbeiten Sie die Klasse und machen es subclassable, oder Bearbeiten Sie die Funktion und stellen Sie es nehmen, ein interface statt einer Klasse, oder verwenden Sie eine alternative Funktion.
Den sechs Arten von Objekt-Erreichbarkeit Staaten in Java -
Starkely erreichbar-Objekte - GC nicht sammeln (wieder der belegte Speicher durch) diese Art von Objekten. Diese sind erreichbar über einen root-Knoten oder einem anderen stark erreichbar Objekt (z.B. über lokale Variablen, Klassenvariablen, Instanzvariablen, etc.)
Softly erreichbar-Objekte - GC kann versuchen zu sammeln, diese Art von Objekten je nach Speicher-Konflikte. Diese sind erreichbar von der root über eine oder mehrere soft-Referenz-Objekte
Schwachly erreichbar-Objekte - GC muss sammeln diese Art von Objekten. Diese
sind erreichbar von der root über eine oder mehrere schwache Referenz-Objekte
Wiederbeleben-in der Lage Objekte - GC ist bereits in den Prozess der Erfassung dieser Objekte. Aber Sie können gehen Sie zurück zu einem der Staaten - Stark/Weich/Schwach durch die Ausführung von einigen finalizer
Phantomly erreichbar Objekt - GC ist bereits in den Prozess der Erfassung dieser Objekte, und hat bestimmt nicht wiederbeleben-können von jedem finalizer (wenn es deklariert eine finalize () - Methode selbst, dann deren finalizer ausgeführt wurden). Diese sind erreichbar von der root über eine oder mehrere phantom Referenz-Objekte
Nicht erreichbar Objekt - Ein Objekt ist weder stark, leise, schwach, noch phantom erreichbar, und ist nicht resurrectable. Diese Objekte sind bereit für die Rückgewinnung
Wenn es eine oder mehrere Referenz auf ein Objekt wird es nicht sein, die garbage Collection in Java. Aber diese Regel ist abhängig davon, welche Art von Referenz es ist. Wenn ein Objekt nur eine schwache Referenz im Zusammenhang mit anderen Objekten, dann ist es ein Gültiger Kandidat für die garbage collection.
Nehmen wir ein Beispiel um es besser zu verstehen. Lassen Sie TextView-Objekt (kürzlich Programmierung in Android und so mit Ihrer Klasse zum Beispiel :-)) und wir haben das Programm generierten ids verwendet für seine Identifikation. Diese ids werden verwendet, in einigen anderen Objektes für Referenzierung des TextViews.
Schlüssel TextView-Objekt und Wert die Id. Jetzt, während der Ausführung des Programms haben wir entfernt ein TextView-Objekt sagen textView1. Wir verlangen nicht, dass die view-Objekt, so haben wir es null. Nun, was wird passieren, um die Schlüssel-Wert-paar(textView1, iD1) gespeichert in HashMap. Dieses paar jetzt keinen Sinn macht, und es ist nicht erforderlich, da das textview selbst wird null.
So, programmatischen wir müssen sicherstellen, dass, wenn ein textView ist entfernt dann den entsprechenden Eintrag in der Karte sollte entfernt werden. Nur dann, wird dieses Objekt wird ein Kandidat für die garbage collection. Ansonsten, auch wenn es nicht verwendet wird, zur Laufzeit, das veraltete Objekt nicht Müll gesammelt.
Weich Referenz
Weiche Bezug ist etwas stärker, die schwachen Referenz. Soft-Referenz ermöglicht die garbage collection, bittet aber um den garbage collector, um es zu deaktivieren, nur wenn es keine andere Möglichkeit gibt. Das heißt, es ist für die garbage collection freigegeben, aber der garbage collector kann es zu entfernen, basierend auf dem memory-crunch, die es hat. Wenn es Links mit wenig Speicher und es ist in der Lage, um Speicherplatz freizugeben, dann wird es sammeln Sie die soft-Referenzen.
Sollte man sich bewusst sein, dass eine schwach referenzierte Objekt wird nur gesammelt, wenn es NUR schwache Referenz(en). Wenn es so viel wie eine starke Referenz, es wird nicht erhoben, egal wie viele schwache Referenzen, die es hat.
WeakReference: Objekte, die nur schwach referenziert werden gesammelt bei jedem GC-Zyklus (geringfügig oder voll).
SoftReference: wenn Objekte, die nur leise verwiesen wird, erhoben werden hängt ab von:
-XX:SoftRefLRUPolicyMSPerMB=N-flag (default-Wert ist 1000, auch bekannt als 1 Sekunde)
Menge des freien Speichers im heap.
Beispiel:
heap hat 10 MB freier Speicherplatz (nach der full GC);
-XX:SoftRefLRUPolicyMSPerMB=1000
Dann Objekt, das referenziert wird nur von SoftReference werden gesammelt, wenn auch in letzter Zeit, wenn es war, auf die zugegriffen wird, größer ist als 10 Sekunden.
Vom Verständnis Schwache Verweisedie von Ethan Nicholas:
Und Peter Kessler fügte in einem Kommentar:
InformationsquelleAutor der Antwort Michael Myers
Schwache Referenzen werden eifrig gesammelt. Wenn GC findet, dass ein Objekt
weakly reachable (erreichbar nur durch schwache Referenzen), es werden klar die
schwache Referenzen auf dieses Objekt sofort. Als solche, Sie sind gut für
hält eine Referenz auf ein Objekt, für das Sie Ihr Programm auch hält
(stark auf die verwiesen wird) "zugehörige Informationen" somewere, wie Cache
reflection Informationen über eine Klasse, oder ein wrapper für ein Objekt, etc.
Alles, was keinen Sinn macht zu halten, nachdem das Objekt, das es verbunden ist
mit GC-ed. Wenn der schwache Referenz wird gelöscht, es wird eingereiht in eine
Referenz-Warteschlange, dass Ihre code-Umfragen irgendwo, und er verwirft die
zugehörige Objekte als gut. Das heißt, Sie halten zusätzliche Informationen über eine
Objekt, aber diese information ist nicht erforderlich, wenn ein Objekt es sich bezieht
geht Weg. Eigentlich, in bestimmten Situationen können Sie sogar Unterklasse
WeakReference und halten die damit verbundenen zusätzlichen Informationen über das Objekt
in den Bereichen der WeakReference Unterklasse. Eine weitere typische Verwendung von
WeakReference ist in Verbindung mit Karten für das halten kanonischen Instanzen.
SoftReferences auf der anderen Seite sind gut für die Zwischenspeicherung von externen, recreatable Ressourcen
als die GC in der Regel Verzögerungen ausgleichen. Es garantiert aber, dass alle
SoftReferences bekommen wird gelöscht, bevor OutOfMemoryError geworfen wird, so dass Sie
theoretisch kann nicht dazu führen, dass ein OOME[*].
Typische use-case-Beispiel ist das halten einer geparsten form eines Inhalts von einem
Datei. Würden Sie implementieren ein system, wo würden Sie eine Datei laden, analysieren Sie diese, und halten
eine SoftReference, um das root-Objekt des geparsten Darstellung. Das nächste mal
Sie müssen die Datei, die Sie werde versuchen, um es abzurufen durch die SoftReference. Wenn
Sie können es abrufen, man erspart sich einen anderen laden/Parsen, und wenn der GC
es geklärt in der Zwischenzeit, laden Sie es. Auf diese Weise, Sie nutzen kostenlos
Speicher für performance-Optimierung, aber nicht das Risiko ein OOME.
Nun für die [*]. Halten einer SoftReference kann nicht dazu führen, dass ein OOME in sich selbst. Wenn
auf der anderen hand, die Sie irrtümlich mit SoftReference für eine Aufgabe eine WeakReference gemeint ist
verwendet werden (das heißt, Sie halten Informationen, die einem Objekt zugeordnet irgendwie
stark referenziert wird, und verwerfen es, wenn die Referenz-Objekt bekommt
gelöscht), Sie kann in die OOME, wie Ihr code, der abfragt, der ReferenceQueue
und verwirft die zugehörigen Objekte passieren könnte, nicht rechtzeitig
Mode.
So, die Entscheidung ist abhängig von der Nutzung
- wenn Sie die Zwischenspeicherung von Informationen, die teuer in der Konstruktion, aber
dennoch reconstructible von anderen Daten, die Verwendung von soft-Referenzen
- wenn Sie halten eine Referenz auf eine kanonische Instanz der einige Daten, oder
möchten Sie eine Referenz auf ein Objekt ohne "Besitz" (so
verhindert GC würde), eine schwache Referenz.
InformationsquelleAutor der Antwort driekken
In Java; Reihenfolge von der stärksten zur schwächsten, die es gibt: Stark, Soft -, Weak-und Phantom -
Einen Starken Bezug ist eine normale Referenz, die dem Schutz der genannten Objekt aus der Sammlung von GC. d.h. Niemals Müll sammelt.
Einen Weich Referenz ist berechtigt, die zur Abholung durch den garbage-collector, aber wahrscheinlich nicht gesammelt werden, bis sich Ihr Speicherplatz benötigt wird. also Müll sammelt, bevor
OutOfMemoryError
.Einen Schwache Referenz ist eine Referenz, die nicht zu schützen, eine referenzierte Objekt aus der Sammlung von GC. also Müll sammelt, wenn keine Starken oder Weichen refs.
Einen Phantom Referenz ist eine Referenz auf ein Objekt ist phantomly verwiesen, nachdem es abgeschlossen wurde, aber vor seinem zugewiesenen Speicher zurückgefordert wurde.
Quelle
Analogie: Übernehmen eine JVM ist ein Königreich, das Objekt ist ein König Reich, und der GC ist ein Angreifer des Königreichs, die versucht, den König töten(Objekt).
InformationsquelleAutor der Antwort Premraj
Schwache Referenz
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ref/WeakReference.html
Prinzip:
weak reference
ist in Bezug auf garbage collection. Normalerweise, Objekt mit einem oder mehrerenreference
werden nicht für die garbage collection freigegeben.Die oben genannten Grundsatz ist nicht anwendbar, wenn es
weak reference
. Wenn ein Objekt nur eine schwache Referenz mit anderen Objekten, dann ist alles bereit für die garbage collection.Betrachten wir das folgende Beispiel: Wir haben eine
Map
mit Objekten, wo die Schlüssel verweisen auf ein Objekt.Nun, während der Ausführung das Programm, das wir gemacht haben
emp = null
. DieMap
mit dem Schlüssel macht keinen Sinn hier, wie es istnull
. In der oben genannten situation, das Objekt ist nicht Müll gesammelt.WeakHashMap
WeakHashMap
ist eine, wo die Einträge (key-to-value mappings
) entfernt wird, wenn es nicht mehr möglich ist, rufen Sie von derMap
.Lassen Sie mich das Beispiel oben denselben mit WeakHashMap
Ausgabe: Nahm
20 calls to System.gc()
zu führenaMap size
: 0.WeakHashMap
hat nur schwache Referenzen auf die Tasten, nicht mit starken Referenzen wie andereMap
Klassen. Gibt es Situationen, die Sie haben zu kümmern, wenn der Wert oder Schlüssel ist stark referenziert, obwohl Sie verwendet werdenWeakHashMap
. Dies können Sie vermeiden, indem Sie wickelt das Objekt in einen WeakReference.Soft-Referenzen.
Soft Reference
ist etwas stärker, die schwachen Referenz. Soft-Referenz ermöglicht die garbage collection, bittet aber um den garbage collector, um es zu deaktivieren, nur wenn es keine andere Möglichkeit gibt.Den garbage collector nicht aggressiv sammeln leise erreichbar Objekten, wie es funktioniert mit schwach erreichbar-stattdessen sammelt nur leise erreichbar-Objekte, wenn es wirklich "braucht" das Gedächtnis. Soft-Referenzen sind eine Art zu sagen, der garbage collector, "solange die Erinnerung ist nicht zu eng, ich möchte zu halten das Objekt herum. Aber wenn der Speicher wirklich eng ist, gehen Sie voran und sammeln Sie es, und ich werde damit umzugehen." Der garbage collector benötigt wird, um alle zu löschen soft-Verweise, bevor Sie es werfen kann
OutOfMemoryError
.InformationsquelleAutor der Antwort Thalaivar
Der einzige wirkliche Unterschied zwischen einem soft-Referenz und eine schwache Referenz ist, dass der garbage collector
uses algorithms to decide whether or not to reclaim a softly reachable object, but always reclaims a weakly reachable object.
InformationsquelleAutor der Antwort Samir Mangroliya
SoftReference
ist konzipiert für caches. Wenn festgestellt wird, dass einWeakReference
verweist auf einen sonst nicht erreichbaren Objekt, dann bekommt es sofort gelöscht.SoftReference
gelassen werden können. In der Regel gibt es einige-Algorithmus in Bezug auf die Menge des freien Speichers und die Zeit, die Sie zuletzt verwendet, um zu bestimmen, ob es gelöscht werden soll. Die aktuelle Sonne-Algorithmus ist klar die Referenz, wenn es nicht verwendet wurde, in wie vielen Sekunden es sind Megabyte freien Arbeitsspeicher auf dem Java-heap (konfigurierbar, server HotSpot prüft, gegen die maximal mögliche heap-wie durch-Xmx
).SoftReference
s geklärt sein wird, bevorOutOfMemoryError
geworfen wird, sofern nicht anders erreichbar.InformationsquelleAutor der Antwort Tom Hawtin - tackline
Der Einzige Wirkliche Unterschied
Pro der doclose WeakReferences muss gelöscht werden durch einen Laufenden GC.
Pro der doclose SoftReferences muss geklärt sein, bevor OOM ausgelöst.
Das ist der einzige wirkliche Unterschied. Alles andere ist nicht Teil des Vertrages. (Ich nehme an die neuesten docs sind vertragliche.)
SoftReferences sind nützlich. Speicher-und Kleinschreibung caches verwenden SoftReferences, nicht WeakReferences.
Den nur richtige Verwendung von WeakReference zu beachten ist bei der GC laufen. Sie tun dies, indem eine neue WeakReference, deren Gegenstand unmittelbar den Bereich verlässt, dann versuchen Sie null aus
weak_ref.get()
. Wenn esnull
Sie lernen, dass zwischen dieser Dauer die GC lief.Als für falsche Verwendung von WeakReference, die Liste ist endlos:
ein mieser hack zu implementieren Priorität-2 softreference, so dass Sie nicht haben, um eines zu schreiben, noch es funktioniert nicht wie erwartet, da der cache gelöscht werden, auf jeder GC laufen, auch wenn es spare-Speicher. Sehen https://stackoverflow.com/a/3243242/632951 für phails. (Außerdem, was ist, wenn man mehr als 2 Level cache Priorität? Sie würden immer noch gotta brauchen eine echte Bibliothek.)
ein mieser hack zu verknüpfen, Daten mit einem Objekt zu einer vorhandenen Klasse, noch es entsteht ein Speicherleck (OutOfMemoryError), wenn dein GC beschließt, eine Auszeit zu nehmen, nachdem Ihre weakreferences sind erstellt. Außerdem, es ist nicht hässlich: Ein besserer Ansatz ist die Verwendung von Tupeln.
ein mieser hack zu verknüpfen, Daten mit einem Objekt einer bestehenden Klasse, wobei die Klasse, die Nerven, um sich nicht subclassable, und wird in eine vorhandene Funktion codedie Sie aufrufen müssen. In einem solchen Fall die richtige Lösung ist entweder Bearbeiten Sie die Klasse und machen es subclassable, oder Bearbeiten Sie die Funktion und stellen Sie es nehmen, ein interface statt einer Klasse, oder verwenden Sie eine alternative Funktion.
InformationsquelleAutor der Antwort Pacerier
Den sechs Arten von Objekt-Erreichbarkeit Staaten in Java -
sind erreichbar von der root über eine oder mehrere schwache Referenz-Objekte
Weitere details: https://www.artima.com/insidejvm/ed2/gc16.html « Zusammenbruch
InformationsquelleAutor der Antwort V.Vidyasagar
Schwache Referenz
Wenn es eine oder mehrere Referenz auf ein Objekt wird es nicht sein, die garbage Collection in Java. Aber diese Regel ist abhängig davon, welche Art von Referenz es ist. Wenn ein Objekt nur eine schwache Referenz im Zusammenhang mit anderen Objekten, dann ist es ein Gültiger Kandidat für die garbage collection.
Nehmen wir ein Beispiel um es besser zu verstehen. Lassen Sie TextView-Objekt (kürzlich Programmierung in Android und so mit Ihrer Klasse zum Beispiel :-)) und wir haben das Programm generierten ids verwendet für seine Identifikation. Diese ids werden verwendet, in einigen anderen Objektes für Referenzierung des TextViews.
Schlüssel TextView-Objekt und Wert die Id. Jetzt, während der Ausführung des Programms haben wir entfernt ein TextView-Objekt sagen textView1. Wir verlangen nicht, dass die view-Objekt, so haben wir es null. Nun, was wird passieren, um die Schlüssel-Wert-paar(textView1, iD1) gespeichert in HashMap. Dieses paar jetzt keinen Sinn macht, und es ist nicht erforderlich, da das textview selbst wird null.
So, programmatischen wir müssen sicherstellen, dass, wenn ein textView ist entfernt dann den entsprechenden Eintrag in der Karte sollte entfernt werden. Nur dann, wird dieses Objekt wird ein Kandidat für die garbage collection. Ansonsten, auch wenn es nicht verwendet wird, zur Laufzeit, das veraltete Objekt nicht Müll gesammelt.
Weich Referenz
Weiche Bezug ist etwas stärker, die schwachen Referenz. Soft-Referenz ermöglicht die garbage collection, bittet aber um den garbage collector, um es zu deaktivieren, nur wenn es keine andere Möglichkeit gibt. Das heißt, es ist für die garbage collection freigegeben, aber der garbage collector kann es zu entfernen, basierend auf dem memory-crunch, die es hat. Wenn es Links mit wenig Speicher und es ist in der Lage, um Speicherplatz freizugeben, dann wird es sammeln Sie die soft-Referenzen.
InformationsquelleAutor der Antwort Kumar Shashwat
Sollte man sich bewusst sein, dass eine schwach referenzierte Objekt wird nur gesammelt, wenn es NUR schwache Referenz(en). Wenn es so viel wie eine starke Referenz, es wird nicht erhoben, egal wie viele schwache Referenzen, die es hat.
InformationsquelleAutor der Antwort Fai Lau
WeakReference: Objekte, die nur schwach referenziert werden gesammelt bei jedem GC-Zyklus (geringfügig oder voll).
SoftReference: wenn Objekte, die nur leise verwiesen wird, erhoben werden hängt ab von:
-XX:SoftRefLRUPolicyMSPerMB=N-flag (default-Wert ist 1000, auch bekannt als 1 Sekunde)
Menge des freien Speichers im heap.
Beispiel:
Dann Objekt, das referenziert wird nur von SoftReference werden gesammelt, wenn auch in letzter Zeit, wenn es war, auf die zugegriffen wird, größer ist als 10 Sekunden.
InformationsquelleAutor der Antwort Artem Petrov