1. Referenztyp (ohne starke Referenz)
Es kann verstanden werden, dass die direkte Referenzunterklasse von JVM verarbeitet wird, sodass sie keinen Einfluss auf die direkte Vererbung des Referenztyps im Code hat. Es kann nur aus seiner Unterklasse geerbt werden. Die entsprechenden Unterklassentypen enthalten die folgenden. (Ignorieren Sie diejenigen, die in Java nicht verwendet werden, wie z. B. Jnireference)
Weiche
Schwachreferenz
FinalReference
Phantomreferenz
Der obige Referenztyp wird auch im entsprechenden Javadoc erwähnt. FinalReference wurde speziell für die Finalize -Methode entwickelt, und es gibt mehrere andere spezifische Anwendungsszenarien. Unter ihnen wird die Sozidreferenz in Speicher-Caches verwendet. In den meisten Szenarien im Zusammenhang mit dem Recycling wird schwachreferenz verwendet. PhantomReference wird in Rückrufszenarien zum Verpackungsobjektrecycling (z. B. Erkennung von Ressourcenleckagen) verwendet.
Sie können die Subklasseninformationen verschiedener Typen in der IDE direkt anzeigen, um zu verstehen, welche Szenarien in den meisten Frameworks verwendet werden, indem die entsprechenden Typen erben, damit wir tatsächlich die Type -Auswahlverarbeitung durchführen können.
2. Referenzkonstruktor
Es bietet zwei interne Konstruktoren, eine mit einer Warteschlange und einer ohne Warteschlange. Die Bedeutung der Warteschlange ist, dass wir diese Warteschlange extern überwachen können. Das heißt, wenn ein Objekt recycelt werden soll, wird das entsprechende Referenzobjekt in diese Warteschlange platziert. Wenn wir die Referenz erhalten, können wir weitere Transaktionen durchführen.
Wenn Sie dies nicht tun, können Sie das Referenzobjekt nur kontinuierlich trainieren und beurteilen, ob die Get -In -In -Inside -Null zurückgegeben werden (das PhantomReference -Objekt kann dies nicht tun, das Get gibt immer Null zurück, sodass es nur einen Konstruktor mit einer Warteschlange hat). Beide Methoden haben je nach tatsächlicher Anwendung entsprechende Nutzungsszenarien. Beispielsweise in WeaphasMap entscheiden Sie sich für die Abfrage der Warteschlangendaten, um festzustellen, ob ein Objekt recycelt wird. Bei ThreadLocalMap wird es verwendet, um festzustellen, ob GET () für die Verarbeitung null ist.
Der entsprechende Konstruktor ist wie folgt:
Referenz (t Referenz) {this (referent, null);} Referenz (t Referenz, Referenzqueue <? Super t> Quiere) {this.referent = referent; this.queue = (Queue == NULL)? Referenzqueue.null: Warteschlange;}Die Null -Warteschlange hier kann als Warteschlange verstanden werden, für die keine Verarbeitung der Daten in ihrer Warteschlange erforderlich ist. Und es wird keine Daten darin zugreifen.
Im obigen Objekt repräsentiert die Referenz das Objekt, das es referenziert, dh das Objekt, in das wir beim Konstruktion eingewickelt werden müssen. Die Definition, dass das Objekt recycelt werden soll, bedeutet, dass dieses Objekt keine andere Referenz hat, außer für die Referenz (nicht, dass es nicht wirklich nicht referenziert wird, aber die GCCOT -Zugänglichkeit ist nicht erreichbar, um das Problem der kreisförmigen Referenz zu vermeiden).
Eine Warteschlange ist die Warteschlange, die benachrichtigt wird, wenn das Objekt recycelt wird. Wenn das Objekt recycelt wird, wird das gesamte Referenzobjekt (nicht das recycelte Objekt) in die Warteschlange platziert, und dann können externe Programme die entsprechenden Daten durch Überwachung dieser Warteschlange erhalten.
3. Referenzqueue und Referenzkette
Die Warteschlange hier ist nominell eine Warteschlange, aber es gibt keine tatsächliche Speicherstruktur im Inneren. Der Speicher hängt von der Beziehung zwischen internen Knoten ab. Es ist zu verstehen, dass die Warteschlange eine Struktur ist, die einer verknüpften Liste ähnelt, und der Knoten hier tatsächlich die Referenz selbst. Es ist zu verstehen, dass die Warteschlange ein Container für eine verknüpfte Liste ist, in der nur der aktuelle Kopfknoten gespeichert ist, und die nachfolgenden Knoten werden von jedem Referenzknoten durch die nächste aufrechterhalten.
Referenzstatuswert
Jedes Referenzobjekt verfügt über eine entsprechende Zustandsbeschreibung, dh es beschreibt sich selbst und das verpackte Objekt, das derzeit in der Bequemlichkeit der Abfragung, Positionierung oder Verarbeitung ist.
1. Aktiv: Der aktive Zustand, dh das entsprechende Objekt ist ein starker Referenzzustand und wurde nicht recycelt. In diesem Zustand wird das Objekt nicht in die Warteschlange gestellt. In diesem Zustand kommt als nächstes Null, und die Warteschlange ist die Warteschlange, auf die sie definiert ist.
2. Ausstehend: Bereiten Sie sich darauf vor, es in die Warteschlange zu stellen. In diesem Zustand werden die zu verarbeitenden Objekte einzeln in der Warteschlange in die Warteschlange gestellt. Während dieses Zeitfensters befinden sich die entsprechenden Objekte im ausstehenden Zustand. Unabhängig davon, auf welche Referenz, wenn Sie diesen Zustand eingeben, können Sie denken, dass im entsprechenden Zustand als nächstes (von JVM) und die Warteschlange die Warteschlange ist, auf die er definiert ist.
3.. Enqued: Das entsprechende Objekt muss bereits recycelt werden, und das entsprechende Referenzobjekt wurde in die Warteschlange platziert. Der externe Thread ist bereit, die Warteschlange abzufragen, um die entsprechenden Daten zu erhalten. In diesem Zustand kommt das nächste Objekt, das verarbeitet wird, und die Warteschlange ist das spezielle Identifikationsobjekt, das erweitert wird.
4. Inaktiv: Das heißt, dieses Objekt wurde von außen aus der Warteschlange abgerufen und verarbeitet. Dies bedeutet, dass dieses Referenzobjekt recycelt werden kann und das intern eingekapselte Objekt auch recycelt werden kann (der tatsächliche Recycling -Vorgang hängt davon ab, ob die klare Aktion aufgerufen wird). Es ist zu verstehen, dass diejenigen, die in diesen Staat eintreten, recycelt werden müssen.
JVM muss den Zustandswert nicht definieren, um zu bestimmen, in welchem Staat sich die entsprechende Referenz befindet. Es muss nur als nächstes berechnet werden, und die Warteschlange, um Urteile zu fällen.
4. Referenzqueue#Kopf
Speichern Sie immer den neuesten Knoten, der in der aktuellen Warteschlange verarbeitet werden soll. Sie können die Warteschlange als Last-In-First-Out-Warteschlange betrachten. Wenn ein neuer Knoten eintritt, wird die folgende Logik übernommen.
Newe.Next = Head; Head = Newe;
Verwenden Sie dann beim Aufnehmen die entsprechende Logik
tmp = head; head = tmp.Next; return tmp;
V. Referenz#Weiter
Beschreiben Sie den nächsten Knoten, der vom Referenzknoten gespeichert wird, der kurz vor dem Verarbeiten wird. Aber als nächstes wird es nur sinnvoll sein, wenn er in die Warteschlange platziert wird. Um den entsprechenden Statuswert zu beschreiben, bezieht sich die Warteschlange nach der Platzierung in der Warteschlange nicht mehr auf die Warteschlange. Stattdessen bezieht es sich auf ein spezielles Enquoed. Da es in die Warteschlange gestellt wurde, wird es nicht wieder in die Warteschlange gestellt.
6. Referenz#Referent
Beschreiben Sie das tatsächliche Objekt, auf das die aktuelle Referenz verwiesen wird und die in der Annotation sorgfältig verarbeitet wird. Das heißt, wenn dieses Ding recycelt wird und wenn es recycelt wird, wird es direkt auf Null gesetzt, und externe Programme können aus dem Referenzobjekt selbst (und nicht des Referenz) lernen, dass das Recyclingverhalten auftritt.
7. Referenzqueue#Enqueue Explent Reference Enqueue
Dieser Vorgang ist der Prozess des Referenzobjekts von aktiven, ausstehenden. Diese Methode soll das Objekt verarbeiten, das den ausstehenden Zustand als gestützten Zustand behandelt. Der entsprechende Vorgang ist die vorherige Logik, dh ein Knoten wird eingeführt und der entsprechende Code ist wie folgt.
R.Queue = Enqued; R.Next = (Kopf == NULL)? R: Kopf; Kopf = r; Queuuelength ++; lock.notifyAll ();
Die letzte Nitify bedeutet, das externe Programm zu benachrichtigen, das zuvor in der aktuellen Warteschlange blockiert. (Das heißt, das ausstehende Objekt wurde zuvor nicht erhalten)
8. Referenz#tryHandlepending
Das heißt, es behandelt die Änderung des Referenzobjekts von aktiv in den anstehenden Zustand. Innerhalb des Referenzobjekts befindet sich ein statisches Feld, und seine entsprechende Erklärung lautet wie folgt:
/* Liste der Referenzen, die darauf warten, aufgenommen zu werden. Der Sammler fügt * Verweise auf diese Liste hinzu, während der Referenz-Handler-Thread sie entfernt. Diese Liste ist durch das obige Sperrobjekt geschützt. Die * Liste verwendet das entdeckte Feld, um seine Elemente zu verknüpfen. */private statische Referenz <Object> anhängig = null;
Es ist zu verstehen, dass JVM das Objekt auf diesem statischen Feld bei GC verarbeitet. Gleichzeitig repräsentiert ein anderes Feld das nächste Objekt des zu verarbeitenden Objekts. Das heißt, es kann verstanden werden, dass das zu verarbeitende Objekt auch eine verknüpfte Liste ist. Es wird durch Entdeckung in die Warteschlange gestellt. Sie müssen nur noch ausstehend werden und dann kontinuierlich das nächste Objekt durch Entdeckung erhalten. Da beide Threads auf dieses ausstehende Objekt zugreifen können, ist es erforderlich, die Sperrverarbeitung zu verwenden.
Der entsprechende Verarbeitungsprozess ist wie folgt:
if (ausstehend! = null) {r = ausstehend; // 'InstanceOf' könnte manchmal ausgeworfen werden. (Reiniger) R: NULL; // UNLINK 'R' von 'ausstehender' Kette anhängig = r.discovered; r.discovered = null;} // Enqueue das Verarbeitungsobjekt, dh es tritt in den Referenzqueue der gestrichenen Zustand <? Super -Objekt> q = R.Queue; if (q! = referencequeue.null) q.enqueue (r);9. Referenz#Clear
Löschen Sie das vom Referenzobjekt verwiesene ursprüngliche Objekt, so dass auf das ursprüngliche Objekt nicht mehr über die Get () -Methode zugegriffen werden kann. Aus der entsprechenden Designidee, da es das Warteschlangenobjekt eingegeben hat, bedeutet dies, dass das entsprechende Objekt recycelt werden muss, da nicht wieder auf das ursprüngliche Objekt zugreifen muss. Diese Methode wird von der JVM nicht aufgerufen, und JVM löscht die entsprechende Referenz direkt durch Feldvorgänge, und seine spezifische Implementierung stimmt mit der aktuellen Methode überein.
Die Semantik des Klares besteht darin, die Referenz zu null.
Nachdem das WewReference -Objekt in die Warteschlange eingetreten ist, ist die entsprechende Referenz null.
Softrreference -Objekt, wenn das Objekt die Warteschlange nicht eingibt, wenn der Speicher ausreicht, ist die entsprechende Referenz nicht null. Wenn es verarbeitet werden muss (nicht genügend Speicher oder andere Richtlinien), wird die entsprechende Referenz auf Null gesetzt und dann die Warteschlange eingeben.
FinalReference -Objekt, da es sein Finalize -Objekt aufrufen muss, auch wenn seine Referenz in eine Warteschlange eingegeben wird, wird seine Referenz nicht null sein, dh es wird nicht gelöscht.
Das PhantomReference -Objekt ist, weil das Get selbst implementiert ist, um NULL zurückzugeben, nicht sehr nützlich. Weil es nicht gelöscht wird, unabhängig davon, ob es sich um einen Enqueue handelt oder nicht.
10. Referenzhandler Enqueue -Thread
Wie oben erwähnt, setzt JVM das Objekt, das in das ausstehende Objekt verarbeitet werden soll, sodass ein Thread vorhanden sein, um kontinuierliche Enqueue -Operationen auszuführen. Dieser Thread bezieht sich auf den Prozessor -Thread, und seine Priorität ist max_priorität, dh das höchste. Der entsprechende Startprozess wird eine statische Initialisierung erstellt, die so verstanden werden kann, dass ein Referenzobjekt oder eine Referenzobjekt oder eine Klasse verwendet wird, dieser Thread erstellt und gestartet wird. Der entsprechende Code lautet wie folgt:
static {ThreadGroup tg = thread.currentThread (). GetThreadGroup (); für (Threadgroup TGN = TG; TGN! = NULL; TG = TGN, TGN = tg.getParent ()); Thread Handler = New ReferenceHandler (TG, "Referenzhandler"); / * Wenn es eine spezielle Priorität von speziellem System mehr gäbe als * max_priority, würde es hier verwendet */ Handler.setPriority (Thread.Max_Priority); Handler.Setdaemon (wahr); Handler.Start ();}Seine Priorität ist die höchste, die als die Notwendigkeit verstanden werden kann, Referenzobjekte kontinuierlich zu verarbeiten. Beim Drucken eines laufenden Threads über JStack bezieht sich der entsprechende Referenzhandler auf den hier initialisierten Thread, wie unten gezeigt:
11. JVM verwandt
In jedem der oben genannten Verarbeitungspunkte beziehen sie sich mit dem JVM -Recyclingprozess. Das heißt, es wird angenommen, dass der GC -Prozess in Verbindung mit der entsprechenden Referenz funktioniert. Unter Verwendung des CMS -Kollektors wird beispielsweise der PRECLEAN -Prozess in den oben genannten Prozess beteiligt, und die Verarbeitung von Softrreference -Bemerkung usw. muss gleichzeitig auch verschiedene Verarbeitung des Referenzobjekts mit dem spezifischen Typ in Verbindung gebracht werden. Die entsprechende JVM -Verarbeitung verwendet C ++ - Code, sodass er sorgfältig aussortiert werden muss.
12. Zusammenfassung
Wie beim FinalReference -Objekt handelt es sich bei der gesamten Referenz und Referenzqueue um eine Gruppe von Verarbeitungsgruppen, die zusammenarbeiten. Um unterschiedliche Referenzsemantik zu gewährleisten, wird der Prozess mit JVM GC schließlich für verschiedene Szenarien und verschiedene Referenzstufen realisiert.
Da die direkte Verwendung von Referenzqueue- und Öffnen von Threads zur Überwachung von Warteschlangen zu problematisch und kompliziert ist. Sie können sich auf FinalizIsReferencequeue beziehen, die von Google Guava und dem entsprechenden FinalizIsReferenference -Objekt implementiert sind. Der Verarbeitungsprozess kann ein wenig vereinfacht werden. Das oben genannte ist der gesamte Inhalt dieses Artikels, und ich hoffe, dass es allen Lernen oder Arbeiten mit Hilfe von Hilfe leistet.