JavaRush /Java-Blog /Random-DE /Unterschiede zwischen schwachen, weichen, Phantom- und re...
theGrass
Level 24
Саратов

Unterschiede zwischen schwachen, weichen, Phantom- und regulären Referenzen in Java

Veröffentlicht in der Gruppe Random-DE
„Schwache“ Referenzen und „weiche“ Referenzen (WeakReference, SoftReference) wurden schon vor langer Zeit zur Java- API hinzugefügt, aber nicht jeder Programmierer ist mit ihnen vertraut. Dies weist auf eine Lücke im Verständnis hin, wo und wie sie eingesetzt werden sollen. Referenzklassen sind im Kontext der Garbage Collection besonders wichtig . Wie wir alle wissen, gibt der Garbage Collector selbst den von Objekten belegten Speicher frei, aber nicht alle Programmierer wissen, dass er die Entscheidung, Speicher freizugeben, auf der Grundlage der Art der für das Objekt verfügbaren Referenzen trifft. Unterschiede zwischen schwachen, weichen, Phantom- und regulären Referenzen in Java - 1Der Hauptunterschied zwischen SoftReference und WeakReference besteht darin, wie der Collector mit ihnen arbeitet. Sie kann ein Objekt jederzeit löschen, wenn nur schwache Links darauf verweisen. Andererseits werden Objekte mit einem Softlink nur dann gesammelt, wenn die JVM wirklich Speicher benötigt. Aufgrund dieser Merkmale von Referenzklassen hat jede von ihnen ihre eigene Verwendung. SoftReference kann zum Implementieren von Caches verwendet werden. Wenn die JVM Speicher benötigt, gibt sie diesen durch das Löschen solcher Objekte frei. Und WeakReferences eignen sich hervorragend zum Speichern von Metadaten, beispielsweise zum Speichern eines Links zu einem ClassLoader. Wenn keine Klassen geladen werden müssen, macht es keinen Sinn, einen Verweis auf den ClassLoader zu speichern . Ein schwacher Verweis macht den ClassLoader zum Entfernen verfügbar, sobald wir ihn anstelle eines starken Verweises zuweisen. In diesem Artikel werden wir uns mit den Unterschieden zwischen den Linktypen befassen, einschließlich der starken Referenz und der Phantomreferenz .

WeakReference vs. SoftReference in Java

Für diejenigen, die es nicht wissen: Es gibt 4 Arten von Links:
  1. Starke Referenz
  2. Schwache Referenz
  3. Weiche Referenz
  4. Phantomreferenz
Der starke Link ist der einfachste, da wir ihn jeden Tag in der Programmierung verwenden, zum Beispiel in Code wie String s = „abc“ ist die Variable s der starke Link. Jedes Objekt, das über eine starke Referenz verfügt, darf vom Garbage Collector nicht entfernt werden. Natürlich handelt es sich hierbei um Objekte, die das Java- Programm benötigt. Schwache Referenzen werden durch die Klasse java.lang.ref.WeakReference dargestellt . Sie können eine schwache Referenz wie folgt definieren:
Counter counter = new Counter(); // strong reference
WeakReference weakCounter = new WeakReference(counter); //weak reference
counter = null; // now Counter object is eligible for garbage collection
Sobald Sie nun den starken Referenzzähler auf null setzen (Zähler = null), wird das in der ersten Zeile erstellte Objekt für die Garbage-Collection-Sammlung verfügbar, da es keine starke Referenz mehr hat. Die von Weak erstellte schwacheCounter-Referenz kann den Collector nicht daran hindern, das Counter-Objekt zu löschen. Wäre es hingegen eine Soft-Referenz, würde das Counter-Objekt erst dann gelöscht, wenn die JVM einen besonders hohen Speicherbedarf hätte. Soft-Referenzen in Java werden durch die Klasse java.lang.ref.SoftReference dargestellt . Beispiel für die Erstellung einer SoftReference in Java
Counter prime = new Counter();  // prime holds a strong reference
SoftReference soft = new SoftReference(prime) ; //soft reference variable has SoftReference to Counter Object
prime = null;  // now Counter object is eligible for garbage collection but only be collected when JVM absolutely needs memory
Nach dem Löschen der starken Referenz (in der 3. Zeile) bleibt nur noch eine weiche Referenz auf dem Counter-Objekt übrig, was den Garbage Collector nicht daran hindern kann, dieses Objekt zu löschen, aber im Gegensatz zu einer schwachen Referenz ist dies möglich diesen Vorgang aufzuschieben, bis ein akuter Gedächtnismangel vorliegt. Angesichts dieses Unterschieds zwischen Softlinks und Weaklinks eignet sich ersterer besser für Caches und schwacher Link für Metadaten. Ein gutes Beispiel ist die WeakHashMap-Klasse, die wie die HashMap- oder TreeMap- Klassen ein Nachkomme der Map-Schnittstelle ist , jedoch ein besonderes Merkmal aufweist. WeakHashMap verpackt Schlüssel als schwache Referenzen, was bedeutet, dass schwache Referenzen, die sich innerhalb der WeakHashMap befinden, Sie nicht vor dem Garbage Collector retten, sobald keine starken Referenzen auf ein Objekt vorhanden sind . Phantomlinks sind die dritte Art von Links, die im Paket java.lang.ref verfügbar sind. Phantomreferenzen werden durch die Klasse java.lang.ref.PhantomReference dargestellt . Ein Objekt, auf das nur Phantom-Links verweisen, kann vom Collector jederzeit gelöscht werden. Ein Phantom- Link wird auf die gleiche Weise erstellt wie ein schwacher oder weicher Link.
DigitalCounter digit = new DigitalCounter(); // digit reference variable has strong reference
PhantomReference phantom = new PhantomReference(digit); // phantom reference
digit = null;
Sobald Sie die starken Verweise auf das DigitalCounter-Objekt löschen, wird der Garbage Collector es jederzeit löschen, da jetzt nur noch Phantomverweise darauf verweisen. Zusätzlich zu den Klassen WeakReference, SoftReference, PhantomReference und WeakHashMap ist es hilfreich, die Klasse ReferenceQueue zu kennen . Sie können diese Klasse verwenden, wenn Sie ein WeakReference-, SoftReference- oder PhantomReference-Objekt erstellen:
ReferenceQueue refQueue = new ReferenceQueue(); //reference will be stored in this queue for cleanup
DigitalCounter digit = new DigitalCounter();
PhantomReference phantom = new PhantomReference(digit, refQueue);
Die Objektreferenz wird zur ReferenceQueue hinzugefügt und Sie können den Status der Referenzen überwachen, indem Sie die ReferenceQueue abfragen. Der Lebenszyklus von Objekten wird in diesem Diagramm gut dargestellt: Unterschiede zwischen schwachen, weichen, Phantom- und regulären Referenzen in Java - 2Das sind alle Unterschiede zwischen schwachen und weichen Referenzen in Java . Wir haben uns auch mit Phantom-Links, der WeakHashMap- Klasse und ReferenceQueue vertraut gemacht . Die korrekte Verwendung von Referenzen hilft bei der Speicherbereinigung und führt zu einer flexibleren Speicherverwaltung in Java . Originaler Artikel
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION