Heim >Java >javaLernprogramm >Starke Referenzen, weiche Referenzen, schwache Referenzen und virtuelle Referenzen in der Java-Entwicklung
Aufgrund des automatischen GC-Recyclingmechanismus verfügt Java über einen relativ vollständigen Referenzzählmechanismus. Java unterteilt die von Objekten gehaltenen Referenzen in der Reihenfolge ihrer Stärke in starke Referenzen, weiche Referenzen und virtuelle Referenzen GC kann Instanzen, die ihren Lebenszyklus überschritten haben, schnell recyceln, sodass die Speichernutzung der Maschine dynamisch niedrig ist. Eine unsachgemäße Verwendung führt zu Speicherlecks, was dazu führt, dass der Speicher der Maschine erschöpft ist und wir dies klar kontrollieren müssen Die Eigenschaften des Programms, das Sie schreiben, bestehen darin, das Programm in einem kontrollierbaren Zustand zu halten, zumindest in dem, was derzeit als kontrollierbar gilt. Lassen Sie uns zunächst die Klassifizierung von Zitaten verstehen und dann die Verwendungsszenarien untersuchen.
1. Starkes Zitat
Was wir normalerweise verwenden, ist ein starkes Zitat, wie zum Beispiel:
Map<String, Object> param = new HashMap<String, Object>(16);
Ein Zitat in der oben genannten Form ist ein starkes Zitat, Solange das Zitat noch vorhanden ist, kann der GC den der Referenz entsprechenden Speicherplatz auf dem Heap nicht recyceln. Die Verwendung und die Regeln starker Referenzen sind selbstverständlich.
2. Weiche Zitate
Sehen wir uns zunächst an, wie man weiche Zitate verwendet:
Map<String, Object> param = new HashMap<String, Object>(16); param.put("status", 1); SoftReference
Es gibt noch eine weitere Anwendungsebene, die jedoch leicht zu verstehen ist Die Soft-Referenz ist nur eine Art Referenz, die der starken Referenz unterlegen ist. Nur wenn die virtuelle Maschine denkt, dass der Speicher nicht ausreicht, wird der Heap-Speicherplatz, auf den durch die Soft-Referenz verwiesen wird, auch dann angezeigt, wenn sie sich noch im Lebenszyklus befindet Soft-Referenzen werden zu diesem Zeitpunkt weiterhin zwangsweise zurückgefordert, sodass die Leistung von Soft-Referenzen unter normalen Umständen dieselbe ist wie die von starken Referenzen Enge, weiche Referenzen spiegeln seine Eigenschaften wider.
3. Schwache Referenz
So verwenden Sie eine schwache Referenz:
Map<String, Object> param = new HashMap<String, Object>(16); param.put("status", 1); WeakReference> weakRef = new WeakReference >(param); System.out.println(weakRef.get().get("status"));
Eine schwache Referenz wird fast genauso verwendet wie eine weiche Referenz Soft-Referenz. Eine Referenz, eine schwache Referenz auf eine Instanz, wird vom Referenzzähler nicht gezählt. Wenn eine Instanz also keine starke Referenz, sondern nur eine schwache Referenz hat, kann sie null zurückgeben, je nachdem, ob der GC recycelt wurde Es gibt, wie im obigen Beispiel, gleichzeitig starke und schwache Referenzen. Schauen wir uns die Situation an, in der nur schwache Referenzen vorhanden sind:
WeakReference<Map<String, Object>> weakRef = new WeakReference<Map<String, Object>>(new HashMap<String, Object>(16)); System.gc(); System.out.println(weakRef.get());
Zu diesem Zeitpunkt ist der gedruckte Wert null bedeutet, dass schwache Referenzen für die GC-Referenztechnologie nicht gültig sind. Beachten Sie dies, wenn Sie sie verwenden.
4. Virtuelle Referenzen
Die Methode zur Verwendung virtueller Referenzen unterscheidet sich geringfügig von der oben genannten. Wenn der GC die Wiederverwendung eines Objekts vorbereitet und feststellt, dass es noch eine virtuelle Referenz hat, Diese virtuelle Referenz wird der zugehörigen Referenzwarteschlange hinzugefügt. In Abschnitt 3.2.3 der zweiten Ausgabe von „Vertiefendes Verständnis der Java Virtual Machine: JVM Advanced Features and Best Practices“ gibt es eine Passage, in der es heißt: „Virtuelle Referenzen werden auch Ghost-Referenzen oder Phantom-Referenzen genannt.“ Ob ein Objekt über eine virtuelle Referenz verfügt, hat keinen Einfluss auf seine Lebensdauer. Der einzige Zweck des Festlegens einer virtuellen Referenzbeziehung für ein Objekt besteht darin, es beim Empfang einer Systembenachrichtigung wiederverwenden zu können. Nach JDK 1.2 wird die PhantomReference-Klasse bereitgestellt, um virtuelle Referenzen zu implementieren Der folgende Code zeigt eine Demo:
public class PhantomReference<T> extends Reference<T> { public T get() { return null; } public PhantomReference(T referent, ReferenceQueue<? super T> q) { super(referent, q); } }
Das gedruckte Ergebnis ist null und eine Instanz von PhantomReference, die überprüft, ob eine Objektinstanz nicht über eine virtuelle Referenz abgerufen werden kann und der Referenz Fakten hinzugefügt werden die Referenzwarteschlange.
Das obige ist der detaillierte Inhalt vonStarke Referenzen, weiche Referenzen, schwache Referenzen und virtuelle Referenzen in der Java-Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!