Heim >Java >javaLernprogramm >Was sind Java-Referenztypen?

Was sind Java-Referenztypen?

青灯夜游
青灯夜游Original
2020-07-25 11:52:257010Durchsuche

In Java gehören zu den Referenztypen: 1. Starke Referenz (StrongReference);

Was sind Java-Referenztypen?

Java-Referenztypen

Im Allgemeinen gibt es zwei Arten von Java-Typen, nämlich Basisdatentypen und Referenzdatentypen . Unter diesen bezieht sich der Referenzdatentyp auf das Objekt, auf das im Speicherheap verwiesen werden muss. Referenz ist eine objektorientierte Funktion von Java.

Ab JDK1.2 sind die Referenztypen in Java in vier Typen unterteilt, nämlich:

①Strong Reference (StrongReference)

②SoftRefernce

③Weak Referenz (WeakReference)

④Phantom Reference (PhantomReference)

Starke Referenz-StarkeReferenz

Diese Art von Referenz wird normalerweise am häufigsten in der Entwicklung verwendet , wie Stringstrong=newString("StrongReference"), wenn ein Instanzobjekt eine starke Referenz hat, wird der Garbage Collector das Objekt nicht recyceln. Wenn nicht genügend Speicher vorhanden ist, löst er lieber eine OutOfMemeryError-Ausnahme aus, als die starke Referenz zu recyceln Da die JVM davon ausgeht, dass es sich bei dem stark referenzierten Objekt um das vom Benutzer verwendete Objekt handelt, kann sie nicht erkennen, welches Objekt recycelt werden soll. Eine erzwungene Wiederverwertung kann zu schwerwiegenden Fehlern im System führen.

Soft Reference-SoftReference

Wenn ein Objekt nur eine Soft-Referenz hat, recycelt die JVM das Objekt nur, wenn nicht genügend Speicher vorhanden ist, und recycelt es nicht andere Fälle. Soft-Referenzen können in Verbindung mit ReferenceQueue verwendet werden. Wenn das Objekt der Soft-Referenz aufgrund unzureichenden Systemspeichers recycelt wird, fügt die JVM die Soft-Referenz der zugehörigen ReferenceQueue hinzu.

ReferenceQueuereferenceQueue=newReferenceQueue();
SoftReference<Book>softReference=newSoftReference<>(newBook(),referenceQueue);
Bookbook=softReference.get();
Referencereference=referenceQueue.poll();

Wenn der Systemspeicher nicht ausreicht, wird gc ausgelöst, das Buch wird recycelt und die Referenz ist nicht null.

Weak Reference-WeakReference

Objekte mit nur schwachen Referenzen werden recycelt, wenn die JVM gc auslöst. Im Gegensatz zu Soft-Referenzen werden schwache Referenzen unabhängig davon, ob nicht genügend Speicher vorhanden ist, recycelt. Schwache Referenzen können in Verbindung mit ReferenceQueue verwendet werden, wenn das System gc auslöst und das Soft-Referenzobjekt recycelt wird. Die Priorität des Garbage Collector-Threads ist jedoch sehr niedrig Schwache Referenzen können möglicherweise nicht schnell recycelt werden. Das Folgende ist ein Beispiel für die aktive Auslösung von GC, um diese Schlussfolgerung zu überprüfen.

ReferenceQueuereferenceQueue=newReferenceQueue();
WeakReference<Book>weakReference=newWeakReference(newBook(),referenceQueue);
Bookbook=softReference.get();
System.gc();
//Runtime.getRuntime().gc();
Referencereference=referenceQueue.poll();

Natürlich kann dies nicht jedes Mal reproduziert werden, da wir System.gc() nur aufrufen, um der JVM mitzuteilen, dass es Zeit ist, Müll zu sammeln, aber es ist nicht sicher, wann sie dies tun wird , aber soweit ich es getestet habe, scheint die Wahrscheinlichkeit eines erneuten Auftretens immer noch sehr hoch zu sein, solange Sie System.gc() noch ein paar Mal schreiben.

Virtuelle Referenz-PhantomReferenz

Wenn ein Objekt nur über Phantomreferenzen verfügt, kann der Garbage Collector es jederzeit recyceln. Phantomreferenzen werden hauptsächlich zum Verfolgen verwendet Die Aktivität eines Objekts, das vom Garbage Collector recycelt wird. Wenn es recycelt wird, fügt die JVM diese schwache Referenz der zugehörigen ReferenceQueue hinzu.

Anders als weiche Referenzen und schwache Referenzen muss ihnen eine ReferenceQueue zugeordnet sein. Der durch phantomReference.get() erhaltene Wert ist null. Stellen Sie sich vor, dass keine ReferenceQueue damit verknüpft ist der Existenz?

PhantomReference<Book>phantomReference=newPhantomReference<>(newBook(),referenceQueue);
Bookbook=phantomReference.get();//此值为null
Referencereference=referenceQueue.poll();

Empfohlenes Tutorial: „Java-Tutorial

Das obige ist der detaillierte Inhalt vonWas sind Java-Referenztypen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn