Weiche Referenzen in Java

Weiche Referenzen in Java

1. Überblick

In diesem kurzen Artikel werden wir über weiche Referenzen in Java sprechen.

Wir erklären, was sie sind, warum wir sie brauchen und wie man sie erstellt.

2. Was sind weiche Referenzen?

Ein weiches Referenzobjekt (oder ein weich erreichbares Objekt) kann vom Garbage Collector als Reaktion auf eine Speicheranforderung gelöscht werden. A softly reachable object has no strong references pointing to it.

Wenn ein Garbage Collector aufgerufen wird, durchläuft er alle Elemente im Heap. GC speichert Referenztypobjekte in einer speziellen Warteschlange.

Nachdem alle Objekte im Heap überprüft wurden, bestimmt GC, welche Instanzen entfernt werden sollen, indem Objekte aus der oben genannten Warteschlange entfernt werden.

Diese Regeln variieren von einer JVM-Implementierung zur anderen, aber die Dokumentation besagt, dassall soft references to softly-reachable objects are guaranteed to be cleared before a JVM throws an OutOfMemoryError.

Es wird jedoch keine Garantie dafür übernommen, wann ein weicher Verweis gelöscht wird oder in welcher Reihenfolge ein Satz solcher Verweise auf verschiedene Objekte gelöscht wird.

In der Regel wählen JVM-Implementierungen zwischen der Bereinigung von kürzlich erstellten oder kürzlich verwendeten Referenzen.

Weich erreichbare Objekte bleiben nach der letzten Referenzierung einige Zeit am Leben. Der Standardwert ist eine Sekunde Lebensdauer pro freiem Megabyte im Heap. Dieser Wert kann mit dem Flag-XX:SoftRefLRUPolicyMSPerMB angepasst werden.

Um beispielsweise den Wert auf 2,5 Sekunden (2500 Millisekunden) zu ändern, können Sie Folgendes verwenden:

-XX:SoftRefLRUPolicyMSPerMB=2500

Im Vergleich zu schwachen Referenzen können weiche Referenzen eine längere Lebensdauer haben, da sie so lange bestehen bleiben, bis zusätzlicher Speicher benötigt wird.

Daher sind sie eine bessere Wahl, wenn wir Objekte so lange wie möglich im Speicher halten müssen.

3. Anwendungsfälle für weiche Referenzen

Soft references can be used for implementing memory-sensitive caches, bei denen die Speicherverwaltung ein sehr wichtiger Faktor ist.

Solange der Referent einer weichen Referenz gut erreichbar ist, dh tatsächlich verwendet wird, wird die Referenz nicht gelöscht.

Ein Cache kann zum Beispiel verhindern, dass seine zuletzt verwendeten Einträge verworfen werden, indem starke Verweise auf diese Einträge beibehalten werden. Die verbleibenden Einträge bleiben dem Garbage Collector überlassen.

4. Arbeiten mit weichen Referenzen

In Java wird eine weiche Referenz durch die Klassejava.lang.ref.SoftReferencedargestellt.

Wir haben zwei Möglichkeiten, um es zu initialisieren.

Der erste Weg ist, nur einen Referenten zu übergeben:

StringBuilder builder = new StringBuilder();
SoftReference reference1 = new SoftReference<>(builder);

Die zweite Option impliziert die Übergabe einer Referenz auf einjava.lang.ref.ReferenceQueue sowie einer Referenz auf einen Referenten. Reference queues are designed for making us aware of actions performed by the Garbage Collector. Es hängt ein Referenzobjekt an eine Referenzwarteschlange an, während es beschließt, den Referenten dieser Referenz zu entfernen.

Hier erfahren Sie, wie Sie einSoftReference mit einemReferenceQueue: initialisieren

ReferenceQueue referenceQueue = new ReferenceQueue<>();
SoftReference reference2
 = new SoftReference<>(builder, referenceQueue);

Alsjava.lang.ref.Reference enthält es die Methodenget undclear, um einen Referenten abzurufen bzw. zurückzusetzen:

StringBuilder builder1 = reference2.get();
reference2.clear();
StringBuilder builder2 = reference2.get(); // null

Jedes Mal, wenn wir mit dieser Art von Referenzen arbeiten, müssen wir sicherstellen, dass ein Referent vorhanden ist, der vonget zurückgegeben wird:

StringBuilder builder3 = reference2.get();
if (builder3 != null) {
    // GC hasn't removed the instance yet
} else {
    // GC has cleared the instance
}

5. Fazit

In diesem Tutorial haben wir uns mit dem Konzept der weichen Referenzen und ihren Anwendungsfällen vertraut gemacht.

Außerdem haben wir gelernt, wie man eine erstellt und programmgesteuert damit arbeitet.