Weiche Referenzen in Java

1. Übersicht

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 einen Speicherbedarf gelöscht werden. Ein leicht erreichbares Objekt weist keine starken Referenzen auf .

Wenn ein Garbage Collector aufgerufen wird, beginnt er, alle Elemente im Heap zu durchlaufen. GC speichert Objekte vom Referenztyp 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. In der Dokumentation wird jedoch angegeben, dass alle weichen Verweise auf leicht erreichbare Objekte garantiert gelöscht werden, bevor eine JVM einen OutOfMemoryError auslöst.

Es gibt jedoch keine Garantie dafür, wann eine weiche Referenz gelöscht wird oder in welcher Reihenfolge eine Reihe solcher Referenzen auf verschiedene Objekte gelöscht wird.

In der Regel wählen JVM-Implementierungen zwischen der Bereinigung kürzlich erstellter oder kürzlich verwendeter Referenzen.

Weich erreichbare Objekte bleiben nach dem letzten Referenzieren noch 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 den Wert beispielsweise 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

Weiche Referenzen können zum Implementieren speichersensitiver Caches verwendet werden, 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 beispielsweise verhindern, dass die zuletzt verwendeten Einträge verworfen werden, indem starke Verweise auf diese Einträge beibehalten werden und die verbleibenden Einträge nach Ermessen des Garbage Collector verworfen werden.

4. Arbeiten mit weichen Referenzen

In Java wird eine weiche Referenz durch die Klasse java.lang.ref.SoftReference dargestellt .

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

Der erste Weg besteht darin, nur einen Referenten zu übergeben:

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

Die zweite Option impliziert die Übergabe eines Verweises auf eine java.lang.ref.ReferenceQueue sowie eines Verweises auf einen Referenten. Referenzwarteschlangen sollen uns auf Aktionen aufmerksam machen, die vom Garbage Collector ausgeführt werden. Es hängt ein Referenzobjekt an eine Referenzwarteschlange an, während es beschließt, den Referenten dieser Referenz zu entfernen.

So initialisieren Sie eine SoftReference mit einer ReferenceQueue:

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

Als java.lang.ref.Reference enthält es die Methoden get und clear , 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 vom get zurückgegebener Referent vorhanden ist:

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

5. Schlussfolgerung

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.